diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 05f69b787a57..3fe854a15d82 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c | |||
| @@ -3479,9 +3479,10 @@ EXPORT_SYMBOL_GPL(rcu_barrier_sched); | |||
| 3479 | static void rcu_init_new_rnp(struct rcu_node *rnp_leaf) | 3479 | static void rcu_init_new_rnp(struct rcu_node *rnp_leaf) |
| 3480 | { | 3480 | { |
| 3481 | long mask; | 3481 | long mask; |
| 3482 | long oldmask; | ||
| 3482 | struct rcu_node *rnp = rnp_leaf; | 3483 | struct rcu_node *rnp = rnp_leaf; |
| 3483 | 3484 | ||
| 3484 | raw_lockdep_assert_held_rcu_node(rnp); | 3485 | raw_lockdep_assert_held_rcu_node(rnp_leaf); |
| 3485 | WARN_ON_ONCE(rnp->wait_blkd_tasks); | 3486 | WARN_ON_ONCE(rnp->wait_blkd_tasks); |
| 3486 | for (;;) { | 3487 | for (;;) { |
| 3487 | mask = rnp->grpmask; | 3488 | mask = rnp->grpmask; |
| @@ -3489,8 +3490,11 @@ static void rcu_init_new_rnp(struct rcu_node *rnp_leaf) | |||
| 3489 | if (rnp == NULL) | 3490 | if (rnp == NULL) |
| 3490 | return; | 3491 | return; |
| 3491 | raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */ | 3492 | raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */ |
| 3493 | oldmask = rnp->qsmaskinit; | ||
| 3492 | rnp->qsmaskinit |= mask; | 3494 | rnp->qsmaskinit |= mask; |
| 3493 | raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */ | 3495 | raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */ |
| 3496 | if (oldmask) | ||
| 3497 | return; | ||
| 3494 | } | 3498 | } |
| 3495 | } | 3499 | } |
| 3496 | 3500 | ||
