Commit 2a2ae872 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: Add *_ONCE() to rcu_data ->rcu_forced_tick



The rcu_data structure's ->rcu_forced_tick field is read locklessly, so
this commit adds WRITE_ONCE() to all updates and READ_ONCE() to all
lockless reads.

This data race was reported by KCSAN.  Not appropriate for backporting
due to failure being unlikely.

Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent a5b89501
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -818,11 +818,12 @@ static __always_inline void rcu_nmi_enter_common(bool irq)
		incby = 1;
	} else if (tick_nohz_full_cpu(rdp->cpu) &&
		   rdp->dynticks_nmi_nesting == DYNTICK_IRQ_NONIDLE &&
		   READ_ONCE(rdp->rcu_urgent_qs) && !rdp->rcu_forced_tick) {
		   READ_ONCE(rdp->rcu_urgent_qs) &&
		   !READ_ONCE(rdp->rcu_forced_tick)) {
		raw_spin_lock_rcu_node(rdp->mynode);
		// Recheck under lock.
		if (rdp->rcu_urgent_qs && !rdp->rcu_forced_tick) {
			rdp->rcu_forced_tick = true;
			WRITE_ONCE(rdp->rcu_forced_tick, true);
			tick_dep_set_cpu(rdp->cpu, TICK_DEP_BIT_RCU);
		}
		raw_spin_unlock_rcu_node(rdp->mynode);
@@ -899,7 +900,7 @@ static void rcu_disable_urgency_upon_qs(struct rcu_data *rdp)
	WRITE_ONCE(rdp->rcu_need_heavy_qs, false);
	if (tick_nohz_full_cpu(rdp->cpu) && rdp->rcu_forced_tick) {
		tick_dep_clear_cpu(rdp->cpu, TICK_DEP_BIT_RCU);
		rdp->rcu_forced_tick = false;
		WRITE_ONCE(rdp->rcu_forced_tick, false);
	}
}