aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-09-29 10:55:41 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2015-12-04 15:27:30 -0500
commit8ba9153b2c3ab733d64e22adb57820ccb6afc496 (patch)
tree4cee3952fd004cdfeda6d39d8f7456c3be3aacb2
parentfecbf6f01fbd83e6419ccb7f61d9a6eb987f1d92 (diff)
rcu: Remove lock-acquisition loop from rcu_read_unlock_special()
Several releases have come and gone without the warning triggering, so remove the lock-acquisition loop. Retain the WARN_ON_ONCE() out of sheer paranoia. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
-rw-r--r--kernel/rcu/tree_plugin.h18
1 files changed, 6 insertions, 12 deletions
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 57ba873d2f18..ae4ce2b665f8 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -449,19 +449,13 @@ void rcu_read_unlock_special(struct task_struct *t)
449 449
450 /* 450 /*
451 * Remove this task from the list it blocked on. The task 451 * Remove this task from the list it blocked on. The task
452 * now remains queued on the rcu_node corresponding to 452 * now remains queued on the rcu_node corresponding to the
453 * the CPU it first blocked on, so the first attempt to 453 * CPU it first blocked on, so there is no longer any need
454 * acquire the task's rcu_node's ->lock will succeed. 454 * to loop. Retain a WARN_ON_ONCE() out of sheer paranoia.
455 * Keep the loop and add a WARN_ON() out of sheer paranoia.
456 */ 455 */
457 for (;;) { 456 rnp = t->rcu_blocked_node;
458 rnp = t->rcu_blocked_node; 457 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
459 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */ 458 WARN_ON_ONCE(rnp != t->rcu_blocked_node);
460 if (rnp == t->rcu_blocked_node)
461 break;
462 WARN_ON_ONCE(1);
463 raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */
464 }
465 empty_norm = !rcu_preempt_blocked_readers_cgp(rnp); 459 empty_norm = !rcu_preempt_blocked_readers_cgp(rnp);
466 empty_exp = sync_rcu_preempt_exp_done(rnp); 460 empty_exp = sync_rcu_preempt_exp_done(rnp);
467 smp_mb(); /* ensure expedited fastpath sees end of RCU c-s. */ 461 smp_mb(); /* ensure expedited fastpath sees end of RCU c-s. */