aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcutree_plugin.h
diff options
context:
space:
mode:
authorPaul E. McKenney <paul.mckenney@linaro.org>2012-06-24 13:15:02 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-07-02 15:34:43 -0400
commit9d2ad24306f2fafc3612e5a216aab31f9e56e879 (patch)
tree6ced8145e842e29aaedda3d9453c74b6f0c92b4f /kernel/rcutree_plugin.h
parent4fa3b6cb1bc8c14b81b4c8ffdfd3f2500a7e9367 (diff)
rcu: Make RCU_FAST_NO_HZ respect nohz= boot parameter
If the nohz= boot parameter disables nohz, then RCU_FAST_NO_HZ needs to also disable itself. This commit therefore checks for tick_nohz_enabled being zero, disabling rcu_prepare_for_idle() if so. This commit assumes that tick_nohz_enabled can change at runtime: If this is not the case, then a simpler approach suffices. Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcutree_plugin.h')
-rw-r--r--kernel/rcutree_plugin.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index c28d25522a81..3508000e077d 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -1971,6 +1971,8 @@ static void rcu_idle_count_callbacks_posted(void)
1971#define RCU_IDLE_GP_DELAY 4 /* Roughly one grace period. */ 1971#define RCU_IDLE_GP_DELAY 4 /* Roughly one grace period. */
1972#define RCU_IDLE_LAZY_GP_DELAY (6 * HZ) /* Roughly six seconds. */ 1972#define RCU_IDLE_LAZY_GP_DELAY (6 * HZ) /* Roughly six seconds. */
1973 1973
1974extern int tick_nohz_enabled;
1975
1974/* 1976/*
1975 * Does the specified flavor of RCU have non-lazy callbacks pending on 1977 * Does the specified flavor of RCU have non-lazy callbacks pending on
1976 * the specified CPU? Both RCU flavor and CPU are specified by the 1978 * the specified CPU? Both RCU flavor and CPU are specified by the
@@ -2112,6 +2114,7 @@ static void rcu_cleanup_after_idle(int cpu)
2112 2114
2113 del_timer(&rdtp->idle_gp_timer); 2115 del_timer(&rdtp->idle_gp_timer);
2114 trace_rcu_prep_idle("Cleanup after idle"); 2116 trace_rcu_prep_idle("Cleanup after idle");
2117 rdtp->tick_nohz_enabled_snap = ACCESS_ONCE(tick_nohz_enabled);
2115} 2118}
2116 2119
2117/* 2120/*
@@ -2137,6 +2140,18 @@ static void rcu_prepare_for_idle(int cpu)
2137{ 2140{
2138 struct timer_list *tp; 2141 struct timer_list *tp;
2139 struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2142 struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
2143 int tne;
2144
2145 /* Handle nohz enablement switches conservatively. */
2146 tne = ACCESS_ONCE(tick_nohz_enabled);
2147 if (tne != rdtp->tick_nohz_enabled_snap) {
2148 if (rcu_cpu_has_callbacks(cpu))
2149 invoke_rcu_core(); /* force nohz to see update. */
2150 rdtp->tick_nohz_enabled_snap = tne;
2151 return;
2152 }
2153 if (!tne)
2154 return;
2140 2155
2141 /* 2156 /*
2142 * If this is an idle re-entry, for example, due to use of 2157 * If this is an idle re-entry, for example, due to use of