]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
rcu: Allow for NULL tick_nohz_full_mask when nohz_full= missing
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 16 Jul 2014 14:37:06 +0000 (07:37 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 16 Jul 2014 17:44:46 +0000 (10:44 -0700)
If there isn't a nohz_full= kernel parameter specified, then
tick_nohz_full_mask can legitimately be NULL.  This can cause
problems when RCU's boot code tries to cpumask_or() this value into
rcu_nocb_mask.  In addition, if NO_HZ_FULL_ALL=y, there is no point
in doing the cpumask_or() in the first place because this will cause
RCU_NOCB_CPU_ALL=y, which in turn will have all bits already set in
rcu_nocb_mask.

This commit therefore avoids the cpumask_or() if NO_HZ_FULL_ALL=y
and checks for !tick_nohz_full_running otherwise, this latter check
catching cases when there was no nohz_full= kernel parameter specified.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/tree_plugin.h

index f62b7f2f6abd5f50fda0b54a7a7801729ae35642..00dc411e9676f92db54e0bbb3489bea9b87e731a 100644 (file)
@@ -2479,9 +2479,10 @@ static void __init rcu_spawn_nocb_kthreads(struct rcu_state *rsp)
 
        if (rcu_nocb_mask == NULL)
                return;
-#ifdef CONFIG_NO_HZ_FULL
-       cpumask_or(rcu_nocb_mask, rcu_nocb_mask, tick_nohz_full_mask);
-#endif /* #ifdef CONFIG_NO_HZ_FULL */
+#if defined(CONFIG_NO_HZ_FULL) && !defined(CONFIG_NO_HZ_FULL_ALL)
+       if (tick_nohz_full_running)
+               cpumask_or(rcu_nocb_mask, rcu_nocb_mask, tick_nohz_full_mask);
+#endif /* #if defined(CONFIG_NO_HZ_FULL) && !defined(CONFIG_NO_HZ_FULL_ALL) */
        if (ls == -1) {
                ls = int_sqrt(nr_cpu_ids);
                rcu_nocb_leader_stride = ls;