diff options
Diffstat (limited to 'kernel/rcutree_plugin.h')
-rw-r--r-- | kernel/rcutree_plugin.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index b1b485111321..15d28febbbd4 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -588,10 +588,15 @@ static int rcu_preempt_offline_tasks(struct rcu_state *rsp, | |||
588 | rnp->exp_tasks = NULL; | 588 | rnp->exp_tasks = NULL; |
589 | #ifdef CONFIG_RCU_BOOST | 589 | #ifdef CONFIG_RCU_BOOST |
590 | rnp->boost_tasks = NULL; | 590 | rnp->boost_tasks = NULL; |
591 | /* In case root is being boosted and leaf was not. */ | 591 | /* |
592 | * In case root is being boosted and leaf was not. Make sure | ||
593 | * that we boost the tasks blocking the current grace period | ||
594 | * in this case. | ||
595 | */ | ||
592 | raw_spin_lock(&rnp_root->lock); /* irqs already disabled */ | 596 | raw_spin_lock(&rnp_root->lock); /* irqs already disabled */ |
593 | if (rnp_root->boost_tasks != NULL && | 597 | if (rnp_root->boost_tasks != NULL && |
594 | rnp_root->boost_tasks != rnp_root->gp_tasks) | 598 | rnp_root->boost_tasks != rnp_root->gp_tasks && |
599 | rnp_root->boost_tasks != rnp_root->exp_tasks) | ||
595 | rnp_root->boost_tasks = rnp_root->gp_tasks; | 600 | rnp_root->boost_tasks = rnp_root->gp_tasks; |
596 | raw_spin_unlock(&rnp_root->lock); /* irqs still disabled */ | 601 | raw_spin_unlock(&rnp_root->lock); /* irqs still disabled */ |
597 | #endif /* #ifdef CONFIG_RCU_BOOST */ | 602 | #endif /* #ifdef CONFIG_RCU_BOOST */ |