diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 18 | 
1 files changed, 8 insertions, 10 deletions
| diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 713eb92314b4..4d296b0fb987 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -98,7 +98,7 @@ struct rcu_state sname##_state = { \  	.level = { &sname##_state.node[0] }, \  	.rda = &sname##_data, \  	.call = cr, \ -	.fqs_state = RCU_GP_IDLE, \ +	.gp_state = RCU_GP_IDLE, \  	.gpnum = 0UL - 300UL, \  	.completed = 0UL - 300UL, \  	.orphan_lock = __RAW_SPIN_LOCK_UNLOCKED(&sname##_state.orphan_lock), \ @@ -1936,16 +1936,15 @@ static bool rcu_gp_fqs_check_wake(struct rcu_state *rsp, int *gfp)  /*   * Do one round of quiescent-state forcing.   */ -static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) +static void rcu_gp_fqs(struct rcu_state *rsp, bool first_time)  { -	int fqs_state = fqs_state_in;  	bool isidle = false;  	unsigned long maxj;  	struct rcu_node *rnp = rcu_get_root(rsp);  	WRITE_ONCE(rsp->gp_activity, jiffies);  	rsp->n_force_qs++; -	if (fqs_state == RCU_SAVE_DYNTICK) { +	if (first_time) {  		/* Collect dyntick-idle snapshots. */  		if (is_sysidle_rcu_state(rsp)) {  			isidle = true; @@ -1954,7 +1953,6 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in)  		force_qs_rnp(rsp, dyntick_save_progress_counter,  			     &isidle, &maxj);  		rcu_sysidle_report_gp(rsp, isidle, maxj); -		fqs_state = RCU_FORCE_QS;  	} else {  		/* Handle dyntick-idle and offline CPUs. */  		isidle = true; @@ -1968,7 +1966,6 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in)  			   READ_ONCE(rsp->gp_flags) & ~RCU_GP_FLAG_FQS);  		raw_spin_unlock_irq(&rnp->lock);  	} -	return fqs_state;  }  /* @@ -2032,7 +2029,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)  	/* Declare grace period done. */  	WRITE_ONCE(rsp->completed, rsp->gpnum);  	trace_rcu_grace_period(rsp->name, rsp->completed, TPS("end")); -	rsp->fqs_state = RCU_GP_IDLE; +	rsp->gp_state = RCU_GP_IDLE;  	rdp = this_cpu_ptr(rsp->rda);  	/* Advance CBs to reduce false positives below. */  	needgp = rcu_advance_cbs(rsp, rnp, rdp) || needgp; @@ -2050,7 +2047,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)   */  static int __noreturn rcu_gp_kthread(void *arg)  { -	int fqs_state; +	bool first_gp_fqs;  	int gf;  	unsigned long j;  	int ret; @@ -2082,7 +2079,7 @@ static int __noreturn rcu_gp_kthread(void *arg)  		}  		/* Handle quiescent-state forcing. */ -		fqs_state = RCU_SAVE_DYNTICK; +		first_gp_fqs = true;  		j = jiffies_till_first_fqs;  		if (j > HZ) {  			j = HZ; @@ -2110,7 +2107,8 @@ static int __noreturn rcu_gp_kthread(void *arg)  				trace_rcu_grace_period(rsp->name,  						       READ_ONCE(rsp->gpnum),  						       TPS("fqsstart")); -				fqs_state = rcu_gp_fqs(rsp, fqs_state); +				rcu_gp_fqs(rsp, first_gp_fqs); +				first_gp_fqs = false;  				trace_rcu_grace_period(rsp->name,  						       READ_ONCE(rsp->gpnum),  						       TPS("fqsend")); | 
