diff options
Diffstat (limited to 'kernel/rcu')
| -rw-r--r-- | kernel/rcu/tree.c | 18 | ||||
| -rw-r--r-- | kernel/rcu/tree.h | 14 | ||||
| -rw-r--r-- | kernel/rcu/tree_trace.c | 2 | 
3 files changed, 12 insertions, 22 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")); diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index 0c33c82cec64..be6d1e8eeb79 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -412,13 +412,6 @@ struct rcu_data {  	struct rcu_state *rsp;  }; -/* Values for fqs_state field in struct rcu_state. */ -#define RCU_GP_IDLE		0	/* No grace period in progress. */ -#define RCU_GP_INIT		1	/* Grace period being initialized. */ -#define RCU_SAVE_DYNTICK	2	/* Need to scan dyntick state. */ -#define RCU_FORCE_QS		3	/* Need to force quiescent state. */ -#define RCU_SIGNAL_INIT		RCU_SAVE_DYNTICK -  /* Values for nocb_defer_wakeup field in struct rcu_data. */  #define RCU_NOGP_WAKE_NOT	0  #define RCU_NOGP_WAKE		1 @@ -468,9 +461,8 @@ struct rcu_state {  	/* The following fields are guarded by the root rcu_node's lock. */ -	u8	fqs_state ____cacheline_internodealigned_in_smp; -						/* Force QS state. */ -	u8	boost;				/* Subject to priority boost. */ +	u8	boost ____cacheline_internodealigned_in_smp; +						/* Subject to priority boost. */  	unsigned long gpnum;			/* Current gp number. */  	unsigned long completed;		/* # of last completed gp. */  	struct task_struct *gp_kthread;		/* Task for grace periods. */ @@ -538,7 +530,7 @@ struct rcu_state {  #define RCU_GP_FLAG_FQS  0x2	/* Need grace-period quiescent-state forcing. */  /* Values for rcu_state structure's gp_flags field. */ -#define RCU_GP_WAIT_INIT 0	/* Initial state. */ +#define RCU_GP_IDLE	 0	/* Initial state and no GP in progress. */  #define RCU_GP_WAIT_GPS  1	/* Wait for grace-period start. */  #define RCU_GP_DONE_GPS  2	/* Wait done for grace-period start. */  #define RCU_GP_WAIT_FQS  3	/* Wait for force-quiescent-state time. */ diff --git a/kernel/rcu/tree_trace.c b/kernel/rcu/tree_trace.c index 6fc4c5ff3bb5..1d61f5ba4641 100644 --- a/kernel/rcu/tree_trace.c +++ b/kernel/rcu/tree_trace.c @@ -268,7 +268,7 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp)  	gpnum = rsp->gpnum;  	seq_printf(m, "c=%ld g=%ld s=%d jfq=%ld j=%x ",  		   ulong2long(rsp->completed), ulong2long(gpnum), -		   rsp->fqs_state, +		   rsp->gp_state,  		   (long)(rsp->jiffies_force_qs - jiffies),  		   (int)(jiffies & 0xffff));  	seq_printf(m, "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld/%ld\n", | 
