diff options
author | Paul E. McKenney <paul.mckenney@linaro.org> | 2012-06-21 23:50:42 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-06-25 15:35:25 -0400 |
commit | b41772abebc27c61dd578b76da99aa5240b4c99a (patch) | |
tree | cb26f8195bcda4aaf6bcbe5de782eec4cef52709 /kernel | |
parent | 6b16351acbd415e66ba16bf7d473ece1574cf0bc (diff) |
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) | |||
1530 | { | 1530 | { |
1531 | unsigned long flags; | 1531 | unsigned long flags; |
1532 | struct rcu_head *next, *list, **tail; | 1532 | struct rcu_head *next, *list, **tail; |
1533 | int bl, count, count_lazy; | 1533 | int bl, count, count_lazy, i; |
1534 | 1534 | ||
1535 | /* If no callbacks are ready, just return.*/ | 1535 | /* If no callbacks are ready, just return.*/ |
1536 | if (!cpu_has_callbacks_ready_to_invoke(rdp)) { | 1536 | 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) | |||
1553 | rdp->nxtlist = *rdp->nxttail[RCU_DONE_TAIL]; | 1553 | rdp->nxtlist = *rdp->nxttail[RCU_DONE_TAIL]; |
1554 | *rdp->nxttail[RCU_DONE_TAIL] = NULL; | 1554 | *rdp->nxttail[RCU_DONE_TAIL] = NULL; |
1555 | tail = rdp->nxttail[RCU_DONE_TAIL]; | 1555 | tail = rdp->nxttail[RCU_DONE_TAIL]; |
1556 | for (count = RCU_NEXT_SIZE - 1; count >= 0; count--) | 1556 | for (i = RCU_NEXT_SIZE - 1; i >= 0; i--) |
1557 | if (rdp->nxttail[count] == rdp->nxttail[RCU_DONE_TAIL]) | 1557 | if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL]) |
1558 | rdp->nxttail[count] = &rdp->nxtlist; | 1558 | rdp->nxttail[i] = &rdp->nxtlist; |
1559 | local_irq_restore(flags); | 1559 | local_irq_restore(flags); |
1560 | 1560 | ||
1561 | /* Invoke callbacks. */ | 1561 | /* Invoke callbacks. */ |
@@ -1583,9 +1583,9 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1583 | if (list != NULL) { | 1583 | if (list != NULL) { |
1584 | *tail = rdp->nxtlist; | 1584 | *tail = rdp->nxtlist; |
1585 | rdp->nxtlist = list; | 1585 | rdp->nxtlist = list; |
1586 | for (count = 0; count < RCU_NEXT_SIZE; count++) | 1586 | for (i = 0; i < RCU_NEXT_SIZE; i++) |
1587 | if (&rdp->nxtlist == rdp->nxttail[count]) | 1587 | if (&rdp->nxtlist == rdp->nxttail[i]) |
1588 | rdp->nxttail[count] = tail; | 1588 | rdp->nxttail[i] = tail; |
1589 | else | 1589 | else |
1590 | break; | 1590 | break; |
1591 | } | 1591 | } |