rcu: Use timer as backstop for NOCB deferred wakeups
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Sun, 30 Apr 2017 03:03:20 +0000 (20:03 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 25 Jul 2017 16:53:09 +0000 (09:53 -0700)
commit8be6e1b15c54402106e6ba9bc706e685458b2d2d
tree55ab977aec658b6c8d0d1c5c59a41fcc80f99ecc
parent520eccdfe187591a51ea9ab4c1a024ae4d0f68d9
rcu: Use timer as backstop for NOCB deferred wakeups

The handling of RCU's no-CBs CPUs has a maintenance headache, namely
that if call_rcu() is invoked with interrupts disabled, the rcuo kthread
wakeup must be defered to a point where we can be sure that scheduler
locks are not held.  Of course, there are a lot of code paths leading
from an interrupts-disabled invocation of call_rcu(), and missing any
one of these can result in excessive callback-invocation latency, and
potentially even system hangs.

This commit therefore uses a timer to guarantee that the wakeup will
eventually occur.  If one of the deferred-wakeup points kicks in, then
the timer is simply cancelled.

This commit also fixes up an incomplete removal of commits that were
intended to plug remaining exit paths, which should have the added
benefit of reducing the overhead of RCU's context-switch hooks.  In
addition, it simplifies leader-to-follower callback-list handoff by
introducing locking.  The call_rcu()-to-leader handoff continues to
use atomic operations in order to maintain good real-time latency for
common-case use of call_rcu().

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
[ paulmck: Dan Carpenter fix for mod_timer() usage bug found by smatch. ]
kernel/rcu/tree.h
kernel/rcu/tree_plugin.h