printk: do not handle non-sleepable notification in console_cpu_notify
[linux-2.6.git] / kernel / padata.c
index 6a51945..b91941d 100644 (file)
@@ -114,7 +114,7 @@ int padata_do_parallel(struct padata_instance *pinst,
        pd = rcu_dereference(pinst->pd);
 
        err = -EINVAL;
-       if (!(pinst->flags & PADATA_INIT))
+       if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID)
                goto out;
 
        if (!cpumask_test_cpu(cb_cpu, pd->cpumask.cbcpu))
@@ -262,7 +262,7 @@ static void padata_reorder(struct parallel_data *pd)
                /*
                 * This cpu has to do the parallel processing of the next
                 * object. It's waiting in the cpu's parallelization queue,
-                * so exit imediately.
+                * so exit immediately.
                 */
                if (PTR_ERR(padata) == -ENODATA) {
                        del_timer(&pd->timer);
@@ -284,7 +284,7 @@ static void padata_reorder(struct parallel_data *pd)
        /*
         * The next object that needs serialization might have arrived to
         * the reorder queues in the meantime, we will be called again
-        * from the timer function if noone else cares for it.
+        * from the timer function if no one else cares for it.
         */
        if (atomic_read(&pd->reorder_objects)
                        && !(pinst->flags & PADATA_RESET))
@@ -515,7 +515,7 @@ static void __padata_stop(struct padata_instance *pinst)
        put_online_cpus();
 }
 
-/* Replace the internal control stucture with a new one. */
+/* Replace the internal control structure with a new one. */
 static void padata_replace(struct padata_instance *pinst,
                           struct parallel_data *pd_new)
 {
@@ -538,7 +538,8 @@ static void padata_replace(struct padata_instance *pinst,
 
        if (notification_mask)
                blocking_notifier_call_chain(&pinst->cpumask_change_notifier,
-                                            notification_mask, pinst);
+                                            notification_mask,
+                                            &pd_new->cpumask);
 
        pinst->flags &= ~PADATA_RESET;
 }
@@ -588,40 +589,65 @@ static bool padata_validate_cpumask(struct padata_instance *pinst,
        return true;
 }
 
+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_get_cpumask: Fetch serial or parallel cpumask from the
- *                     given padata instance and copy it to @out_mask
+ * 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: A pointer to padata instance
- * @cpumask_type: Specifies which cpumask will be copied.
- *                Possible values are PADATA_CPU_SERIAL *or* PADATA_CPU_PARALLEL
- *                corresponding to serial and parallel cpumask respectively.
- * @out_mask: A pointer to cpumask structure where selected
- *            cpumask will be copied.
+ * @pinst: padata instance
+ * @pcpumask: the cpumask to use for parallel workers
+ * @cbcpumask: the cpumsak to use for serial workers
  */
-int padata_get_cpumask(struct padata_instance *pinst,
-                      int cpumask_type, struct cpumask *out_mask)
+int padata_set_cpumasks(struct padata_instance *pinst, cpumask_var_t pcpumask,
+                       cpumask_var_t cbcpumask)
 {
-       struct parallel_data *pd;
-       int ret = 0;
+       int err;
 
-       rcu_read_lock_bh();
-       pd = rcu_dereference(pinst->pd);
-       switch (cpumask_type) {
-       case PADATA_CPU_SERIAL:
-               cpumask_copy(out_mask, pd->cpumask.cbcpu);
-               break;
-       case PADATA_CPU_PARALLEL:
-               cpumask_copy(out_mask, pd->cpumask.pcpu);
-               break;
-       default:
-               ret = -EINVAL;
-       }
+       mutex_lock(&pinst->lock);
+       get_online_cpus();
+
+       err = __padata_set_cpumasks(pinst, pcpumask, cbcpumask);
+
+       put_online_cpus();
+       mutex_unlock(&pinst->lock);
+
+       return err;
 
-       rcu_read_unlock_bh();
-       return ret;
 }
-EXPORT_SYMBOL(padata_get_cpumask);
+EXPORT_SYMBOL(padata_set_cpumasks);
 
 /**
  * padata_set_cpumask: Sets specified by @cpumask_type cpumask to the value
@@ -636,6 +662,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 +677,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)
 {
@@ -785,7 +768,7 @@ static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
 }
 
  /**
- * padata_remove_cpu - remove a cpu from the one or both(serial and paralell)
+ * padata_remove_cpu - remove a cpu from the one or both(serial and parallel)
  *                     padata cpumasks.
  *
  * @pinst: padata instance
@@ -881,7 +864,7 @@ static int padata_cpu_callback(struct notifier_block *nfb,
                err = __padata_add_cpu(pinst, cpu);
                mutex_unlock(&pinst->lock);
                if (err)
-                       return NOTIFY_BAD;
+                       return notifier_from_errno(err);
                break;
 
        case CPU_DOWN_PREPARE:
@@ -892,7 +875,7 @@ static int padata_cpu_callback(struct notifier_block *nfb,
                err = __padata_remove_cpu(pinst, cpu);
                mutex_unlock(&pinst->lock);
                if (err)
-                       return NOTIFY_BAD;
+                       return notifier_from_errno(err);
                break;
 
        case CPU_UP_CANCELED:
@@ -1060,29 +1043,29 @@ static struct kobj_type padata_attr_type = {
 };
 
 /**
- * padata_alloc - Allocate and initialize padata instance.
- *                Use default cpumask(cpu_possible_mask)
- *                for serial and parallel workes.
+ * padata_alloc_possible - Allocate and initialize padata instance.
+ *                         Use the cpu_possible_mask for serial and
+ *                         parallel workers.
  *
  * @wq: workqueue to use for the allocated padata instance
  */
-struct padata_instance *padata_alloc(struct workqueue_struct *wq)
+struct padata_instance *padata_alloc_possible(struct workqueue_struct *wq)
 {
-       return __padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
+       return padata_alloc(wq, cpu_possible_mask, cpu_possible_mask);
 }
-EXPORT_SYMBOL(padata_alloc);
+EXPORT_SYMBOL(padata_alloc_possible);
 
 /**
- * __padata_alloc - allocate and initialize a padata instance
- *                  and specify cpumasks for serial and parallel workers.
+ * padata_alloc - allocate and initialize a padata instance and specify
+ *                cpumasks for serial and parallel workers.
  *
  * @wq: workqueue to use for the allocated padata instance
  * @pcpumask: cpumask that will be used for padata parallelization
  * @cbcpumask: cpumask that will be used for padata serialization
  */
-struct padata_instance *__padata_alloc(struct workqueue_struct *wq,
-                                      const struct cpumask *pcpumask,
-                                      const struct cpumask *cbcpumask)
+struct padata_instance *padata_alloc(struct workqueue_struct *wq,
+                                    const struct cpumask *pcpumask,
+                                    const struct cpumask *cbcpumask)
 {
        struct padata_instance *pinst;
        struct parallel_data *pd = NULL;
@@ -1138,7 +1121,7 @@ err_free_inst:
 err:
        return NULL;
 }
-EXPORT_SYMBOL(__padata_alloc);
+EXPORT_SYMBOL(padata_alloc);
 
 /**
  * padata_free - free a padata instance