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. |
