diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 1449cb69a0e0..cb1caefa8bd0 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -632,7 +632,7 @@ void __rcu_irq_enter_check_tick(void)  	// prevents self-deadlock.  So we can safely recheck under the lock.  	// Note that the nohz_full state currently cannot change.  	raw_spin_lock_rcu_node(rdp->mynode); -	if (rdp->rcu_urgent_qs && !rdp->rcu_forced_tick) { +	if (READ_ONCE(rdp->rcu_urgent_qs) && !rdp->rcu_forced_tick) {  		// A nohz_full CPU is in the kernel and RCU needs a  		// quiescent state.  Turn on the tick!  		WRITE_ONCE(rdp->rcu_forced_tick, true); @@ -677,12 +677,16 @@ static void rcu_disable_urgency_upon_qs(struct rcu_data *rdp)  }  /** - * rcu_is_watching - see if RCU thinks that the current CPU is not idle + * rcu_is_watching - RCU read-side critical sections permitted on current CPU?   * - * Return true if RCU is watching the running CPU, which means that this - * CPU can safely enter RCU read-side critical sections.  In other words, - * if the current CPU is not in its idle loop or is in an interrupt or - * NMI handler, return true. + * Return @true if RCU is watching the running CPU and @false otherwise. + * An @true return means that this CPU can safely enter RCU read-side + * critical sections. + * + * Although calls to rcu_is_watching() from most parts of the kernel + * will return @true, there are important exceptions.  For example, if the + * current CPU is deep within its idle loop, in kernel entry/exit code, + * or offline, rcu_is_watching() will return @false.   *   * Make notrace because it can be called by the internal functions of   * ftrace, and making this notrace removes unnecessary recursion calls.  | 
