|
|
@@ -448,10 +448,12 @@ static void srcu_gp_start(struct srcu_struct *sp)
|
|
|
|
|
|
lockdep_assert_held(&ACCESS_PRIVATE(sp, lock));
|
|
|
WARN_ON_ONCE(ULONG_CMP_GE(sp->srcu_gp_seq, sp->srcu_gp_seq_needed));
|
|
|
+ spin_lock_rcu_node(sdp); /* Interrupts already disabled. */
|
|
|
rcu_segcblist_advance(&sdp->srcu_cblist,
|
|
|
rcu_seq_current(&sp->srcu_gp_seq));
|
|
|
(void)rcu_segcblist_accelerate(&sdp->srcu_cblist,
|
|
|
rcu_seq_snap(&sp->srcu_gp_seq));
|
|
|
+ spin_unlock_rcu_node(sdp); /* Interrupts remain disabled. */
|
|
|
smp_mb(); /* Order prior store to ->srcu_gp_seq_needed vs. GP start. */
|
|
|
rcu_seq_start(&sp->srcu_gp_seq);
|
|
|
state = rcu_seq_state(READ_ONCE(sp->srcu_gp_seq));
|