padata: document multithreaded jobs
Add Documentation for multithreaded jobs. Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Tested-by: Josh Triplett <josh@joshtriplett.org> Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Kirill Tkhai <ktkhai@virtuozzo.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Pavel Machek <pavel@ucw.cz> Cc: Pavel Tatashin <pasha.tatashin@soleen.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Robert Elliott <elliott@hpe.com> Cc: Shile Zhang <shile.zhang@linux.alibaba.com> Cc: Steffen Klassert <steffen.klassert@secunet.com> Cc: Steven Sistare <steven.sistare@oracle.com> Cc: Tejun Heo <tj@kernel.org> Cc: Zi Yan <ziy@nvidia.com> Link: http://lkml.kernel.org/r/20200527173608.2885243-9-daniel.m.jordan@oracle.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ecd0965069
commit
ec3b39c731
|
@ -4,23 +4,26 @@
|
||||||
The padata parallel execution mechanism
|
The padata parallel execution mechanism
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
:Date: December 2019
|
:Date: May 2020
|
||||||
|
|
||||||
Padata is a mechanism by which the kernel can farm jobs out to be done in
|
Padata is a mechanism by which the kernel can farm jobs out to be done in
|
||||||
parallel on multiple CPUs while retaining their ordering. It was developed for
|
parallel on multiple CPUs while optionally retaining their ordering.
|
||||||
use with the IPsec code, which needs to be able to perform encryption and
|
|
||||||
decryption on large numbers of packets without reordering those packets. The
|
|
||||||
crypto developers made a point of writing padata in a sufficiently general
|
|
||||||
fashion that it could be put to other uses as well.
|
|
||||||
|
|
||||||
Usage
|
It was originally developed for IPsec, which needs to perform encryption and
|
||||||
=====
|
decryption on large numbers of packets without reordering those packets. This
|
||||||
|
is currently the sole consumer of padata's serialized job support.
|
||||||
|
|
||||||
|
Padata also supports multithreaded jobs, splitting up the job evenly while load
|
||||||
|
balancing and coordinating between threads.
|
||||||
|
|
||||||
|
Running Serialized Jobs
|
||||||
|
=======================
|
||||||
|
|
||||||
Initializing
|
Initializing
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The first step in using padata is to set up a padata_instance structure for
|
The first step in using padata to run serialized jobs is to set up a
|
||||||
overall control of how jobs are to be run::
|
padata_instance structure for overall control of how jobs are to be run::
|
||||||
|
|
||||||
#include <linux/padata.h>
|
#include <linux/padata.h>
|
||||||
|
|
||||||
|
@ -162,6 +165,24 @@ functions that correspond to the allocation in reverse::
|
||||||
It is the user's responsibility to ensure all outstanding jobs are complete
|
It is the user's responsibility to ensure all outstanding jobs are complete
|
||||||
before any of the above are called.
|
before any of the above are called.
|
||||||
|
|
||||||
|
Running Multithreaded Jobs
|
||||||
|
==========================
|
||||||
|
|
||||||
|
A multithreaded job has a main thread and zero or more helper threads, with the
|
||||||
|
main thread participating in the job and then waiting until all helpers have
|
||||||
|
finished. padata splits the job into units called chunks, where a chunk is a
|
||||||
|
piece of the job that one thread completes in one call to the thread function.
|
||||||
|
|
||||||
|
A user has to do three things to run a multithreaded job. First, describe the
|
||||||
|
job by defining a padata_mt_job structure, which is explained in the Interface
|
||||||
|
section. This includes a pointer to the thread function, which padata will
|
||||||
|
call each time it assigns a job chunk to a thread. Then, define the thread
|
||||||
|
function, which accepts three arguments, ``start``, ``end``, and ``arg``, where
|
||||||
|
the first two delimit the range that the thread operates on and the last is a
|
||||||
|
pointer to the job's shared state, if any. Prepare the shared state, which is
|
||||||
|
typically allocated on the main thread's stack. Last, call
|
||||||
|
padata_do_multithreaded(), which will return once the job is finished.
|
||||||
|
|
||||||
Interface
|
Interface
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue