diff options
author | Paul E. McKenney <paul.mckenney@linaro.org> | 2012-06-24 13:15:02 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-07-02 15:34:43 -0400 |
commit | 9d2ad24306f2fafc3612e5a216aab31f9e56e879 (patch) | |
tree | 6ced8145e842e29aaedda3d9453c74b6f0c92b4f /kernel/rcutree_plugin.h | |
parent | 4fa3b6cb1bc8c14b81b4c8ffdfd3f2500a7e9367 (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.h | 15 |
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 | ||
1974 | extern 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 |