diff options
Diffstat (limited to 'kernel/rcutree_plugin.h')
| -rw-r--r-- | kernel/rcutree_plugin.h | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index f9211548818..5ce3352505e 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h @@ -670,6 +670,9 @@ EXPORT_SYMBOL_GPL(kfree_call_rcu);   * concurrently with new RCU read-side critical sections that began while   * synchronize_rcu() was waiting.  RCU read-side critical sections are   * delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested. + * + * See the description of synchronize_sched() for more detailed information + * on memory ordering guarantees.   */  void synchronize_rcu(void)  { @@ -679,7 +682,10 @@ void synchronize_rcu(void)  			   "Illegal synchronize_rcu() in RCU read-side critical section");  	if (!rcu_scheduler_active)  		return; -	wait_rcu_gp(call_rcu); +	if (rcu_expedited) +		synchronize_rcu_expedited(); +	else +		wait_rcu_gp(call_rcu);  }  EXPORT_SYMBOL_GPL(synchronize_rcu); @@ -757,7 +763,8 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,   * grace period for the specified rcu_node structure.  If there are no such   * tasks, report it up the rcu_node hierarchy.   * - * Caller must hold sync_rcu_preempt_exp_mutex and rsp->onofflock. + * Caller must hold sync_rcu_preempt_exp_mutex and must exclude + * CPU hotplug operations.   */  static void  sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp) @@ -831,7 +838,7 @@ void synchronize_rcu_expedited(void)  			udelay(trycount * num_online_cpus());  		} else {  			put_online_cpus(); -			synchronize_rcu(); +			wait_rcu_gp(call_rcu);  			return;  		}  	} @@ -875,6 +882,11 @@ EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);  /**   * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete. + * + * Note that this primitive does not necessarily wait for an RCU grace period + * to complete.  For example, if there are no RCU callbacks queued anywhere + * in the system, then rcu_barrier() is within its rights to return + * immediately, without waiting for anything, much less an RCU grace period.   */  void rcu_barrier(void)  {  |