diff options
author | Steffen Klassert <steffen.klassert@secunet.com> | 2010-07-27 01:20:47 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2010-07-31 07:53:07 -0400 |
commit | 313910d3b98029a867bb4aa3ee552ae573db0458 (patch) | |
tree | caec2d33a99ada7dcb66523b0d4459565a46fd4e | |
parent | 0500e9b3f11ce84fc6ee48a3e29909145e58ba48 (diff) |
padata: update API documentation
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | Documentation/padata.txt | 76 |
1 files changed, 64 insertions, 12 deletions
diff --git a/Documentation/padata.txt b/Documentation/padata.txt index 93dd4e6db975..473ebf22cd69 100644 --- a/Documentation/padata.txt +++ b/Documentation/padata.txt | |||
@@ -1,5 +1,5 @@ | |||
1 | The padata parallel execution mechanism | 1 | The padata parallel execution mechanism |
2 | Last updated for 2.6.34 | 2 | Last updated for 2.6.36 |
3 | 3 | ||
4 | Padata is a mechanism by which the kernel can farm work out to be done in | 4 | Padata is a mechanism by which the kernel can farm work out to be done in |
5 | parallel on multiple CPUs while retaining the ordering of tasks. It was | 5 | parallel on multiple CPUs while retaining the ordering of tasks. It was |
@@ -13,12 +13,28 @@ overall control of how tasks are to be run: | |||
13 | 13 | ||
14 | #include <linux/padata.h> | 14 | #include <linux/padata.h> |
15 | 15 | ||
16 | struct padata_instance *padata_alloc(const struct cpumask *cpumask, | 16 | struct padata_instance *padata_alloc(struct workqueue_struct *wq, |
17 | struct workqueue_struct *wq); | 17 | const struct cpumask *pcpumask, |
18 | const struct cpumask *cbcpumask); | ||
18 | 19 | ||
19 | The cpumask describes which processors will be used to execute work | 20 | The pcpumask describes which processors will be used to execute work |
20 | submitted to this instance. The workqueue wq is where the work will | 21 | submitted to this instance in parallel. The cbcpumask defines which |
21 | actually be done; it should be a multithreaded queue, naturally. | 22 | processors are allowed to use as the serialization callback processor. |
23 | The workqueue wq is where the work will actually be done; it should be | ||
24 | a multithreaded queue, naturally. | ||
25 | |||
26 | To allocate a padata instance with the cpu_possible_mask for both | ||
27 | cpumasks this helper function can be used: | ||
28 | |||
29 | struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq); | ||
30 | |||
31 | Note: Padata maintains two kinds of cpumasks internally. The user supplied | ||
32 | cpumasks, submitted by padata_alloc/padata_alloc_possible and the 'usable' | ||
33 | cpumasks. The usable cpumasks are always the subset of active cpus in the | ||
34 | user supplied cpumasks, these are the cpumasks padata actually use. So | ||
35 | it is legal to supply a cpumask to padata that contains offline cpus. | ||
36 | Once a offline cpu in the user supplied cpumask comes online, padata | ||
37 | is going to use it. | ||
22 | 38 | ||
23 | There are functions for enabling and disabling the instance: | 39 | There are functions for enabling and disabling the instance: |
24 | 40 | ||
@@ -34,13 +50,49 @@ is unused. | |||
34 | 50 | ||
35 | The list of CPUs to be used can be adjusted with these functions: | 51 | The list of CPUs to be used can be adjusted with these functions: |
36 | 52 | ||
37 | int padata_set_cpumask(struct padata_instance *pinst, | 53 | int padata_set_cpumasks(struct padata_instance *pinst, |
54 | cpumask_var_t pcpumask, | ||
55 | cpumask_var_t cbcpumask); | ||
56 | int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type, | ||
38 | cpumask_var_t cpumask); | 57 | cpumask_var_t cpumask); |
39 | int padata_add_cpu(struct padata_instance *pinst, int cpu); | 58 | int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask); |
40 | int padata_remove_cpu(struct padata_instance *pinst, int cpu); | 59 | int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask); |
60 | |||
61 | Changing the CPU masks are expensive operations, though, so it should not be | ||
62 | done with great frequency. | ||
63 | |||
64 | It's possible to change both cpumasks of a padata instance with | ||
65 | padata_set_cpumasks by specifying the cpumasks for parallel execution (pcpumask) | ||
66 | and for the serial callback function (cbcpumask). padata_set_cpumask is to | ||
67 | change just one of the cpumasks. Here cpumask_type is one of PADATA_CPU_SERIAL, | ||
68 | PADATA_CPU_PARALLEL and cpumask specifies the new cpumask to use. | ||
69 | To simply add or remove one cpu from a certain cpumask the functions | ||
70 | padata_add_cpu/padata_remove_cpu are used. cpu specifies the cpu to add or | ||
71 | remove and mask is one of PADATA_CPU_SERIAL, PADATA_CPU_PARALLEL. | ||
72 | |||
73 | If a user is interested in padata cpumask changes, he can register to | ||
74 | the padata cpumask change notifier: | ||
75 | |||
76 | int padata_register_cpumask_notifier(struct padata_instance *pinst, | ||
77 | struct notifier_block *nblock); | ||
78 | |||
79 | To unregister from that notifier: | ||
80 | |||
81 | int padata_unregister_cpumask_notifier(struct padata_instance *pinst, | ||
82 | struct notifier_block *nblock); | ||
83 | |||
84 | The padata cpumask change notifier notifies about changes of the usable | ||
85 | cpumasks, i.e. the subset of active cpus in the user supplied cpumask. | ||
86 | |||
87 | Padata calls the notifier chain with: | ||
88 | |||
89 | blocking_notifier_call_chain(&pinst->cpumask_change_notifier, | ||
90 | notification_mask, | ||
91 | &pd_new->cpumask); | ||
41 | 92 | ||
42 | Changing the CPU mask has the look of an expensive operation, though, so it | 93 | Here cpumask_change_notifier is registered notifier, notification_mask |
43 | probably should not be done with great frequency. | 94 | is one of PADATA_CPU_SERIAL, PADATA_CPU_PARALLEL and cpumask is a pointer |
95 | to a struct padata_cpumask that contains the new cpumask informations. | ||
44 | 96 | ||
45 | Actually submitting work to the padata instance requires the creation of a | 97 | Actually submitting work to the padata instance requires the creation of a |
46 | padata_priv structure: | 98 | padata_priv structure: |
@@ -53,7 +105,7 @@ padata_priv structure: | |||
53 | 105 | ||
54 | This structure will almost certainly be embedded within some larger | 106 | This structure will almost certainly be embedded within some larger |
55 | structure specific to the work to be done. Most its fields are private to | 107 | structure specific to the work to be done. Most its fields are private to |
56 | padata, but the structure should be zeroed at initialization time, and the | 108 | padata, but the structure should be zeroed at initialisation time, and the |
57 | parallel() and serial() functions should be provided. Those functions will | 109 | parallel() and serial() functions should be provided. Those functions will |
58 | be called in the process of getting the work done as we will see | 110 | be called in the process of getting the work done as we will see |
59 | momentarily. | 111 | momentarily. |