diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-07-16 10:37:06 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-07-16 13:44:46 -0400 |
commit | 187497fa5e9e9383820d33e48b87f8200a747c2a (patch) | |
tree | 7941e912b1a123cf2213797ca49a70bdfa550778 /kernel/rcu/tree_plugin.h | |
parent | 1823172ab582eb54456fd1354869bb850a1196ba (diff) |
rcu: Allow for NULL tick_nohz_full_mask when nohz_full= missing
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>
Diffstat (limited to 'kernel/rcu/tree_plugin.h')
-rw-r--r-- | kernel/rcu/tree_plugin.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index f62b7f2f6abd..00dc411e9676 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h | |||
@@ -2479,9 +2479,10 @@ static void __init rcu_spawn_nocb_kthreads(struct rcu_state *rsp) | |||
2479 | 2479 | ||
2480 | if (rcu_nocb_mask == NULL) | 2480 | if (rcu_nocb_mask == NULL) |
2481 | return; | 2481 | return; |
2482 | #ifdef CONFIG_NO_HZ_FULL | 2482 | #if defined(CONFIG_NO_HZ_FULL) && !defined(CONFIG_NO_HZ_FULL_ALL) |
2483 | cpumask_or(rcu_nocb_mask, rcu_nocb_mask, tick_nohz_full_mask); | 2483 | if (tick_nohz_full_running) |
2484 | #endif /* #ifdef CONFIG_NO_HZ_FULL */ | 2484 | cpumask_or(rcu_nocb_mask, rcu_nocb_mask, tick_nohz_full_mask); |
2485 | #endif /* #if defined(CONFIG_NO_HZ_FULL) && !defined(CONFIG_NO_HZ_FULL_ALL) */ | ||
2485 | if (ls == -1) { | 2486 | if (ls == -1) { |
2486 | ls = int_sqrt(nr_cpu_ids); | 2487 | ls = int_sqrt(nr_cpu_ids); |
2487 | rcu_nocb_leader_stride = ls; | 2488 | rcu_nocb_leader_stride = ls; |