Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU fix from Ingo Molnar.
Fixes a bug introduced in this merge window by commit b1420f1c
("Make
rcu_barrier() less disruptive")
* 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
rcu: Stop rcu_do_batch() from multiplexing the "count" variable
This commit is contained in:
@@ -1530,7 +1530,7 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct rcu_head *next, *list, **tail;
|
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 no callbacks are ready, just return.*/
|
||||||
if (!cpu_has_callbacks_ready_to_invoke(rdp)) {
|
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->nxtlist = *rdp->nxttail[RCU_DONE_TAIL];
|
||||||
*rdp->nxttail[RCU_DONE_TAIL] = NULL;
|
*rdp->nxttail[RCU_DONE_TAIL] = NULL;
|
||||||
tail = rdp->nxttail[RCU_DONE_TAIL];
|
tail = rdp->nxttail[RCU_DONE_TAIL];
|
||||||
for (count = RCU_NEXT_SIZE - 1; count >= 0; count--)
|
for (i = RCU_NEXT_SIZE - 1; i >= 0; i--)
|
||||||
if (rdp->nxttail[count] == rdp->nxttail[RCU_DONE_TAIL])
|
if (rdp->nxttail[i] == rdp->nxttail[RCU_DONE_TAIL])
|
||||||
rdp->nxttail[count] = &rdp->nxtlist;
|
rdp->nxttail[i] = &rdp->nxtlist;
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
/* Invoke callbacks. */
|
/* Invoke callbacks. */
|
||||||
@@ -1583,9 +1583,9 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp)
|
|||||||
if (list != NULL) {
|
if (list != NULL) {
|
||||||
*tail = rdp->nxtlist;
|
*tail = rdp->nxtlist;
|
||||||
rdp->nxtlist = list;
|
rdp->nxtlist = list;
|
||||||
for (count = 0; count < RCU_NEXT_SIZE; count++)
|
for (i = 0; i < RCU_NEXT_SIZE; i++)
|
||||||
if (&rdp->nxtlist == rdp->nxttail[count])
|
if (&rdp->nxtlist == rdp->nxttail[i])
|
||||||
rdp->nxttail[count] = tail;
|
rdp->nxttail[i] = tail;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user