diff options
| author | Paul E. McKenney <paul.mckenney@linaro.org> | 2012-06-24 10:15:02 -0700 | 
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-07-02 12:34:43 -0700 | 
| commit | 9d2ad24306f2fafc3612e5a216aab31f9e56e879 (patch) | |
| tree | 6ced8145e842e29aaedda3d9453c74b6f0c92b4f /kernel | |
| parent | 4fa3b6cb1bc8c14b81b4c8ffdfd3f2500a7e9367 (diff) | |
| download | olio-linux-3.10-9d2ad24306f2fafc3612e5a216aab31f9e56e879.tar.xz olio-linux-3.10-9d2ad24306f2fafc3612e5a216aab31f9e56e879.zip  | |
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')
| -rw-r--r-- | kernel/rcutree.h | 1 | ||||
| -rw-r--r-- | kernel/rcutree_plugin.h | 15 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 2 | 
3 files changed, 17 insertions, 1 deletions
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index 19b61ac1079..e978845c680 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h @@ -97,6 +97,7 @@ struct rcu_dynticks {  				    /* # times non-lazy CBs posted to CPU. */  	unsigned long nonlazy_posted_snap;  				    /* idle-period nonlazy_posted snapshot. */ +	int tick_nohz_enabled_snap; /* Previously seen value from sysfs. */  #endif /* #ifdef CONFIG_RCU_FAST_NO_HZ */  }; diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index c28d25522a8..3508000e077 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h @@ -1971,6 +1971,8 @@ static void rcu_idle_count_callbacks_posted(void)  #define RCU_IDLE_GP_DELAY 4		/* Roughly one grace period. */  #define RCU_IDLE_LAZY_GP_DELAY (6 * HZ)	/* Roughly six seconds. */ +extern int tick_nohz_enabled; +  /*   * Does the specified flavor of RCU have non-lazy callbacks pending on   * the specified CPU?  Both RCU flavor and CPU are specified by the @@ -2112,6 +2114,7 @@ static void rcu_cleanup_after_idle(int cpu)  	del_timer(&rdtp->idle_gp_timer);  	trace_rcu_prep_idle("Cleanup after idle"); +	rdtp->tick_nohz_enabled_snap = ACCESS_ONCE(tick_nohz_enabled);  }  /* @@ -2137,6 +2140,18 @@ static void rcu_prepare_for_idle(int cpu)  {  	struct timer_list *tp;  	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); +	int tne; + +	/* Handle nohz enablement switches conservatively. */ +	tne = ACCESS_ONCE(tick_nohz_enabled); +	if (tne != rdtp->tick_nohz_enabled_snap) { +		if (rcu_cpu_has_callbacks(cpu)) +			invoke_rcu_core(); /* force nohz to see update. */ +		rdtp->tick_nohz_enabled_snap = tne; +		return; +	} +	if (!tne) +		return;  	/*  	 * If this is an idle re-entry, for example, due to use of diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 86999783392..66ff07f6184 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -105,7 +105,7 @@ static ktime_t tick_init_jiffy_update(void)  /*   * NO HZ enabled ?   */ -static int tick_nohz_enabled __read_mostly  = 1; +int tick_nohz_enabled __read_mostly  = 1;  /*   * Enable / Disable tickless mode  |