diff options
Diffstat (limited to 'kernel/rcu/update.c')
| -rw-r--r-- | kernel/rcu/update.c | 22 | 
1 files changed, 20 insertions, 2 deletions
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 5f748c5a40f0..76b94e19430b 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c @@ -60,7 +60,12 @@ MODULE_ALIAS("rcupdate");  #endif  #define MODULE_PARAM_PREFIX "rcupdate." +#ifndef CONFIG_TINY_RCU  module_param(rcu_expedited, int, 0); +module_param(rcu_normal, int, 0); +static int rcu_normal_after_boot; +module_param(rcu_normal_after_boot, int, 0); +#endif /* #ifndef CONFIG_TINY_RCU */  #if defined(CONFIG_DEBUG_LOCK_ALLOC) && defined(CONFIG_PREEMPT_COUNT)  /** @@ -113,6 +118,17 @@ EXPORT_SYMBOL(rcu_read_lock_sched_held);  #ifndef CONFIG_TINY_RCU +/* + * Should expedited grace-period primitives always fall back to their + * non-expedited counterparts?  Intended for use within RCU.  Note + * that if the user specifies both rcu_expedited and rcu_normal, then + * rcu_normal wins. + */ +bool rcu_gp_is_normal(void) +{ +	return READ_ONCE(rcu_normal); +} +  static atomic_t rcu_expedited_nesting =  	ATOMIC_INIT(IS_ENABLED(CONFIG_RCU_EXPEDITE_BOOT) ? 1 : 0); @@ -157,8 +173,6 @@ void rcu_unexpedite_gp(void)  }  EXPORT_SYMBOL_GPL(rcu_unexpedite_gp); -#endif /* #ifndef CONFIG_TINY_RCU */ -  /*   * Inform RCU of the end of the in-kernel boot sequence.   */ @@ -166,8 +180,12 @@ void rcu_end_inkernel_boot(void)  {  	if (IS_ENABLED(CONFIG_RCU_EXPEDITE_BOOT))  		rcu_unexpedite_gp(); +	if (rcu_normal_after_boot) +		WRITE_ONCE(rcu_normal, 1);  } +#endif /* #ifndef CONFIG_TINY_RCU */ +  #ifdef CONFIG_PREEMPT_RCU  /*  | 
