|
@@ -2042,7 +2042,7 @@ static void wake_nocb_leader(struct rcu_data *rdp, bool force)
|
|
|
if (!ACCESS_ONCE(rdp_leader->nocb_kthread))
|
|
|
return;
|
|
|
if (ACCESS_ONCE(rdp_leader->nocb_leader_sleep) || force) {
|
|
|
- /* Prior xchg orders against prior callback enqueue. */
|
|
|
+ /* Prior smp_mb__after_atomic() orders against prior enqueue. */
|
|
|
ACCESS_ONCE(rdp_leader->nocb_leader_sleep) = false;
|
|
|
wake_up(&rdp_leader->nocb_wq);
|
|
|
}
|
|
@@ -2071,6 +2071,7 @@ static void __call_rcu_nocb_enqueue(struct rcu_data *rdp,
|
|
|
ACCESS_ONCE(*old_rhpp) = rhp;
|
|
|
atomic_long_add(rhcount, &rdp->nocb_q_count);
|
|
|
atomic_long_add(rhcount_lazy, &rdp->nocb_q_count_lazy);
|
|
|
+ smp_mb__after_atomic(); /* Store *old_rhpp before _wake test. */
|
|
|
|
|
|
/* If we are not being polled and there is a kthread, awaken it ... */
|
|
|
t = ACCESS_ONCE(rdp->nocb_kthread);
|