|
@@ -1533,6 +1533,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
|
|
rdp = this_cpu_ptr(rsp->rda);
|
|
rdp = this_cpu_ptr(rsp->rda);
|
|
if (rnp == rdp->mynode)
|
|
if (rnp == rdp->mynode)
|
|
__note_gp_changes(rsp, rnp, rdp);
|
|
__note_gp_changes(rsp, rnp, rdp);
|
|
|
|
+ /* smp_mb() provided by prior unlock-lock pair. */
|
|
nocb += rcu_future_gp_cleanup(rsp, rnp);
|
|
nocb += rcu_future_gp_cleanup(rsp, rnp);
|
|
raw_spin_unlock_irq(&rnp->lock);
|
|
raw_spin_unlock_irq(&rnp->lock);
|
|
cond_resched();
|
|
cond_resched();
|
|
@@ -1577,6 +1578,7 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
|
wait_event_interruptible(rsp->gp_wq,
|
|
wait_event_interruptible(rsp->gp_wq,
|
|
ACCESS_ONCE(rsp->gp_flags) &
|
|
ACCESS_ONCE(rsp->gp_flags) &
|
|
RCU_GP_FLAG_INIT);
|
|
RCU_GP_FLAG_INIT);
|
|
|
|
+ /* Locking provides needed memory barrier. */
|
|
if (rcu_gp_init(rsp))
|
|
if (rcu_gp_init(rsp))
|
|
break;
|
|
break;
|
|
cond_resched();
|
|
cond_resched();
|
|
@@ -1606,6 +1608,7 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
|
(!ACCESS_ONCE(rnp->qsmask) &&
|
|
(!ACCESS_ONCE(rnp->qsmask) &&
|
|
!rcu_preempt_blocked_readers_cgp(rnp)),
|
|
!rcu_preempt_blocked_readers_cgp(rnp)),
|
|
j);
|
|
j);
|
|
|
|
+ /* Locking provides needed memory barriers. */
|
|
/* If grace period done, leave loop. */
|
|
/* If grace period done, leave loop. */
|
|
if (!ACCESS_ONCE(rnp->qsmask) &&
|
|
if (!ACCESS_ONCE(rnp->qsmask) &&
|
|
!rcu_preempt_blocked_readers_cgp(rnp))
|
|
!rcu_preempt_blocked_readers_cgp(rnp))
|