|
@@ -1614,7 +1614,6 @@ static int rcu_future_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp)
|
|
|
int needmore;
|
|
|
struct rcu_data *rdp = this_cpu_ptr(rsp->rda);
|
|
|
|
|
|
- rcu_nocb_gp_cleanup(rsp, rnp);
|
|
|
rnp->need_future_gp[c & 0x1] = 0;
|
|
|
needmore = rnp->need_future_gp[(c + 1) & 0x1];
|
|
|
trace_rcu_future_gp(rnp, rdp, c,
|
|
@@ -2010,6 +2009,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
|
|
|
int nocb = 0;
|
|
|
struct rcu_data *rdp;
|
|
|
struct rcu_node *rnp = rcu_get_root(rsp);
|
|
|
+ wait_queue_head_t *sq;
|
|
|
|
|
|
WRITE_ONCE(rsp->gp_activity, jiffies);
|
|
|
raw_spin_lock_irq_rcu_node(rnp);
|
|
@@ -2046,7 +2046,9 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
|
|
|
needgp = __note_gp_changes(rsp, rnp, rdp) || needgp;
|
|
|
/* smp_mb() provided by prior unlock-lock pair. */
|
|
|
nocb += rcu_future_gp_cleanup(rsp, rnp);
|
|
|
+ sq = rcu_nocb_gp_get(rnp);
|
|
|
raw_spin_unlock_irq(&rnp->lock);
|
|
|
+ rcu_nocb_gp_cleanup(sq);
|
|
|
cond_resched_rcu_qs();
|
|
|
WRITE_ONCE(rsp->gp_activity, jiffies);
|
|
|
rcu_gp_slow(rsp, gp_cleanup_delay);
|