aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcu/tree.c
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-04-27 17:05:27 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-07-12 18:38:59 -0400
commitc74859d1eb2d8578bdf6d78ba893e394085aba1a (patch)
tree17e12f56714e9567ea66307fc582abd06f523dd6 /kernel/rcu/tree.c
parent8d672fa6bf68ffc36a0c5e4868499f86bbea2308 (diff)
rcu: Make rcu_report_unblock_qs_rnp() warn on violated preconditions
If rcu_report_unblock_qs_rnp() is invoked on something other than preemptible RCU or if there are still preempted tasks blocking the current grace period, something went badly wrong in the caller. This commit therefore adds WARN_ON_ONCE() to these conditions, but leaving the legitimate reason for early exit (rnp->qsmask != 0) unwarned. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcu/tree.c')
-rw-r--r--kernel/rcu/tree.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 3fe854a15d82..85417584ffd0 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2308,8 +2308,10 @@ static void rcu_report_unblock_qs_rnp(struct rcu_state *rsp,
2308 struct rcu_node *rnp_p; 2308 struct rcu_node *rnp_p;
2309 2309
2310 raw_lockdep_assert_held_rcu_node(rnp); 2310 raw_lockdep_assert_held_rcu_node(rnp);
2311 if (rcu_state_p == &rcu_sched_state || rsp != rcu_state_p || 2311 if (WARN_ON_ONCE(rcu_state_p == &rcu_sched_state) ||
2312 rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) { 2312 WARN_ON_ONCE(rsp != rcu_state_p) ||
2313 WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) ||
2314 rnp->qsmask != 0) {
2313 raw_spin_unlock_irqrestore_rcu_node(rnp, flags); 2315 raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2314 return; /* Still need more quiescent states! */ 2316 return; /* Still need more quiescent states! */
2315 } 2317 }