diff options
| author | Paul E. McKenney <paul.mckenney@linaro.org> | 2012-06-21 20:50:42 -0700 | 
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-06-25 12:35:25 -0700 | 
| commit | b41772abebc27c61dd578b76da99aa5240b4c99a (patch) | |
| tree | cb26f8195bcda4aaf6bcbe5de782eec4cef52709 /kernel | |
| parent | 6b16351acbd415e66ba16bf7d473ece1574cf0bc (diff) | |
| download | linux-b41772abebc27c61dd578b76da99aa5240b4c99a.tar.bz2 | |
rcu: Stop rcu_do_batch() from multiplexing the "count" variable
Commit b1420f1c (Make rcu_barrier() less disruptive) rearranged the
code in rcu_do_batch(), moving the ->qlen manipulation to follow
the requeueing of the callbacks.  Unfortunately, this rearrangement
clobbered the value of the "count" local variable before the value
of rdp->qlen was adjusted, resulting in the value of rdp->qlen being
inaccurate.  This commit therefore introduces an index variable "i",
avoiding the inadvertent multiplexing.
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/rcutree.c | 14 | 
1 files changed, 7 insertions, 7 deletions
| diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 3b0f1337f75b..38ecdda3f55f 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -1530,7 +1530,7 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)  {  	unsigned long flags;  	struct rcu_head *next, *list, **tail; -	int bl, count, count_lazy; +	int bl, count, count_lazy, i;  	/* If no callbacks are ready, just return.*/  	if (!cpu_has_callbacks_ready_to_invoke(rdp)) { @@ -1553,9 +1553,9 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)  	rdp->nxtlist = *rdp->nxttail[RCU_DONE_TAIL];  	*rdp->nxttail[RCU_DONE_TAIL] = NULL;  	tail = rdp->nxttail[RCU_DONE_TAIL]; -	for (count = RCU_NEXT_SIZE - 1; count >= 0; count--) -		if (rdp->nxttail[count] == rdp->nxttail[RCU_DONE_TAIL]) -			rdp->nxttail[count] = &rdp->nxtlist; +	for (i = RCU_NEXT_SIZE - 1; i >= 0; i--) +		if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL]) +			rdp->nxttail[i] = &rdp->nxtlist;  	local_irq_restore(flags);  	/* Invoke callbacks. */ @@ -1583,9 +1583,9 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)  	if (list != NULL) {  		*tail = rdp->nxtlist;  		rdp->nxtlist = list; -		for (count = 0; count < RCU_NEXT_SIZE; count++) -			if (&rdp->nxtlist == rdp->nxttail[count]) -				rdp->nxttail[count] = tail; +		for (i = 0; i < RCU_NEXT_SIZE; i++) +			if (&rdp->nxtlist == rdp->nxttail[i]) +				rdp->nxttail[i] = tail;  			else  				break;  	} |