diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 4 | 
1 files changed, 3 insertions, 1 deletions
| diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index e41dd4131f7a..8e8c6ec1d30f 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -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); | 
