padata: Rearrange set_cpumask functions
authorSteffen Klassert <steffen.klassert@secunet.com>
Tue, 27 Jul 2010 05:15:06 +0000 (07:15 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 31 Jul 2010 11:53:04 +0000 (19:53 +0800)
padata_set_cpumask needs to be protected by a lock. We make
__padata_set_cpumasks unlocked and static. So this function
can be used by the exported and locked padata_set_cpumask and
padata_set_cpumasks functions.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
include/linux/padata.h
kernel/padata.c

index 71dfc9d..bb0fc5d 100644 (file)
@@ -178,9 +178,9 @@ extern int padata_get_cpumask(struct padata_instance *pinst,
                              int cpumask_type, struct cpumask *out_mask);
 extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
                              cpumask_var_t cpumask);
-extern int __padata_set_cpumasks(struct padata_instance *pinst,
-                                cpumask_var_t pcpumask,
-                                cpumask_var_t cbcpumask);
+extern int padata_set_cpumasks(struct padata_instance *pinst,
+                              cpumask_var_t pcpumask,
+                              cpumask_var_t cbcpumask);
 extern int padata_add_cpu(struct padata_instance *pinst, int cpu, int mask);
 extern int padata_remove_cpu(struct padata_instance *pinst, int cpu, int mask);
 extern int padata_start(struct padata_instance *pinst);
index 12860bc..4987203 100644 (file)
@@ -623,6 +623,66 @@ int padata_get_cpumask(struct padata_instance *pinst,
 }
 EXPORT_SYMBOL(padata_get_cpumask);
 
+static int __padata_set_cpumasks(struct padata_instance *pinst,
+                                cpumask_var_t pcpumask,
+                                cpumask_var_t cbcpumask)
+{
+       int valid;
+       struct parallel_data *pd;
+
+       valid = padata_validate_cpumask(pinst, pcpumask);
+       if (!valid) {
+               __padata_stop(pinst);
+               goto out_replace;
+       }
+
+       valid = padata_validate_cpumask(pinst, cbcpumask);
+       if (!valid)
+               __padata_stop(pinst);
+
+out_replace:
+       pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
+       if (!pd)
+               return -ENOMEM;
+
+       cpumask_copy(pinst->cpumask.pcpu, pcpumask);
+       cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
+
+       padata_replace(pinst, pd);
+
+       if (valid)
+               __padata_start(pinst);
+
+       return 0;
+}
+
+/**
+ * padata_set_cpumasks - Set both parallel and serial cpumasks. The first
+ *                       one is used by parallel workers and the second one
+ *                       by the wokers doing serialization.
+ *
+ * @pinst: padata instance
+ * @pcpumask: the cpumask to use for parallel workers
+ * @cbcpumask: the cpumsak to use for serial workers
+ */
+int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask,
+                       cpumask_var_t cbcpumask)
+{
+       int err;
+
+       mutex_lock(&pinst->lock);
+       get_online_cpus();
+
+       err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask);
+
+       put_online_cpus();
+       mutex_unlock(&pinst->lock);
+
+       return err;
+
+}
+EXPORT_SYMBOL(padata_set_cpumasks);
+
 /**
  * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
  *                     equivalent to @cpumask.
@@ -636,6 +696,10 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
                       cpumask_var_t cpumask)
 {
        struct cpumask *serial_mask, *parallel_mask;
+       int err = -EINVAL;
+
+       mutex_lock(&pinst->lock);
+       get_online_cpus();
 
        switch (cpumask_type) {
        case PADATA_CPU_PARALLEL:
@@ -647,65 +711,18 @@ int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
                serial_mask = cpumask;
                break;
        default:
-               return -EINVAL;
+                goto out;
        }
 
-       return __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
-}
-EXPORT_SYMBOL(padata_set_cpumask);
-
-/**
- * __padata_set_cpumasks - Set both parallel and serial cpumasks. The first
- *                         one is used by parallel workers and the second one
- *                         by the wokers doing serialization.
- *
- * @pinst: padata instance
- * @pcpumask: the cpumask to use for parallel workers
- * @cbcpumask: the cpumsak to use for serial workers
- */
-int __padata_set_cpumasks(struct padata_instance *pinst,
-                         cpumask_var_t pcpumask, cpumask_var_t cbcpumask)
-{
-       int valid;
-       int err = 0;
-       struct parallel_data *pd = NULL;
-
-       mutex_lock(&pinst->lock);
-       get_online_cpus();
-
-       valid = padata_validate_cpumask(pinst, pcpumask);
-       if (!valid) {
-               __padata_stop(pinst);
-               goto out_replace;
-       }
-
-       valid = padata_validate_cpumask(pinst, cbcpumask);
-       if (!valid)
-               __padata_stop(pinst);
-
-out_replace:
-       pd = padata_alloc_pd(pinst, pcpumask, cbcpumask);
-       if (!pd) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       cpumask_copy(pinst->cpumask.pcpu, pcpumask);
-       cpumask_copy(pinst->cpumask.cbcpu, cbcpumask);
-
-       padata_replace(pinst, pd);
-
-       if (valid)
-               __padata_start(pinst);
+       err =  __padata_set_cpumasks(pinst, parallel_mask, serial_mask);
 
 out:
        put_online_cpus();
        mutex_unlock(&pinst->lock);
 
        return err;
-
 }
-EXPORT_SYMBOL(__padata_set_cpumasks);
+EXPORT_SYMBOL(padata_set_cpumask);
 
 static int __padata_add_cpu(struct padata_instance *pinst, int cpu)
 {