rcu/nocb: Remove needless LOAD-ACQUIRE
authorFrederic Weisbecker <frederic@kernel.org>
Wed, 15 Nov 2023 19:11:27 +0000 (14:11 -0500)
committerBoqun Feng <boqun.feng@gmail.com>
Wed, 14 Feb 2024 15:50:44 +0000 (07:50 -0800)
The LOAD-ACQUIRE access performed on rdp->nocb_cb_sleep advertizes
ordering callback execution against grace period completion. However
this is contradicted by the following:

* This LOAD-ACQUIRE doesn't pair with anything. The only counterpart
  barrier that can be found is the smp_mb() placed after callbacks
  advancing in nocb_gp_wait(). However the barrier is placed _after_
  ->nocb_cb_sleep write.

* Callbacks can be concurrently advanced between the LOAD-ACQUIRE on
  ->nocb_cb_sleep and the call to rcu_segcblist_extract_done_cbs() in
  rcu_do_batch(), making any ordering based on ->nocb_cb_sleep broken.

* Both rcu_segcblist_extract_done_cbs() and rcu_advance_cbs() are called
  under the nocb_lock, the latter hereby providing already the desired
  ACQUIRE semantics.

Therefore it is safe to access ->nocb_cb_sleep with a simple compiler
barrier.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
kernel/rcu/tree_nocb.h

index 4efbf7333d4e168c3bbaca61b43b919d5ce3fe26..785946834c6b329699e558da3642bda3f53f01ad 100644 (file)
@@ -933,8 +933,7 @@ static void nocb_cb_wait(struct rcu_data *rdp)
                swait_event_interruptible_exclusive(rdp->nocb_cb_wq,
                                                    nocb_cb_wait_cond(rdp));
 
-               // VVV Ensure CB invocation follows _sleep test.
-               if (smp_load_acquire(&rdp->nocb_cb_sleep)) { // ^^^
+               if (READ_ONCE(rdp->nocb_cb_sleep)) {
                        WARN_ON(signal_pending(current));
                        trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("WokeEmpty"));
                }