diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-01-04 15:09:06 -0800 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-01-13 09:06:03 +0100 | 
| commit | 0f10dc826646134dce3e5751512b87d30f3903e4 (patch) | |
| tree | 6d377b3714889a0ab148166a33105b3be14be0c1 | |
| parent | eb1ba45f1e7f6e626fefc063b340c7cbec9bd8c7 (diff) | |
rcu: Eliminate rcu_process_dyntick() return value
Because a new grace period cannot start while we are executing
within the force_quiescent_state() function's switch statement,
if any test within that switch statement or within any function
called from that switch statement shows that the current grace
period has ended, we can safely re-do that test any time before
we leave the switch statement.  This means that we no longer
need a return value from rcu_process_dyntick(), as we can simply
invoke rcu_gp_in_progress() to check whether the old grace
period has finished -- there is no longer any need to worry
about whether or not a new grace period has been started.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <12626465501857-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | kernel/rcutree.c | 17 | 
1 files changed, 6 insertions, 11 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index c7d00700fc4..e4971192fa9 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -1144,11 +1144,9 @@ void rcu_check_callbacks(int cpu, int user)  /*   * Scan the leaf rcu_node structures, processing dyntick state for any that   * have not yet encountered a quiescent state, using the function specified. - * Returns 1 if the current grace period ends while scanning (possibly - * because we made it end).   */ -static int rcu_process_dyntick(struct rcu_state *rsp, -			       int (*f)(struct rcu_data *)) +static void rcu_process_dyntick(struct rcu_state *rsp, +				int (*f)(struct rcu_data *))  {  	unsigned long bit;  	int cpu; @@ -1161,7 +1159,7 @@ static int rcu_process_dyntick(struct rcu_state *rsp,  		spin_lock_irqsave(&rnp->lock, flags);  		if (rnp->completed != rsp->gpnum - 1) {  			spin_unlock_irqrestore(&rnp->lock, flags); -			return 1; +			return;  		}  		if (rnp->qsmask == 0) {  			spin_unlock_irqrestore(&rnp->lock, flags); @@ -1181,7 +1179,6 @@ static int rcu_process_dyntick(struct rcu_state *rsp,  		}  		spin_unlock_irqrestore(&rnp->lock, flags);  	} -	return 0;  }  /* @@ -1193,7 +1190,6 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)  	unsigned long flags;  	struct rcu_node *rnp = rcu_get_root(rsp);  	u8 forcenow; -	u8 gpdone;  	if (!rcu_gp_in_progress(rsp))  		return;  /* No grace period in progress, nothing to force. */ @@ -1226,10 +1222,9 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)  			break; /* So gcc recognizes the dead code. */  		/* Record dyntick-idle state. */ -		gpdone = rcu_process_dyntick(rsp, -					     dyntick_save_progress_counter); +		rcu_process_dyntick(rsp, dyntick_save_progress_counter);  		spin_lock(&rnp->lock);  /* irqs already disabled */ -		if (gpdone) +		if (!rcu_gp_in_progress(rsp))  			break;  		/* fall into next case. */ @@ -1249,7 +1244,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)  		/* Check dyntick-idle state, send IPI to laggarts. */  		spin_unlock(&rnp->lock);  /* irqs remain disabled */ -		gpdone = rcu_process_dyntick(rsp, rcu_implicit_dynticks_qs); +		rcu_process_dyntick(rsp, rcu_implicit_dynticks_qs);  		/* Leave state in case more forcing is required. */  | 
