rcu: Rework detection of use of RCU by offline CPUs
authorPaul E. McKenney <paul.mckenney@linaro.org>
Tue, 31 Jan 2012 01:02:47 +0000 (17:02 -0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 21 Feb 2012 17:06:07 +0000 (09:06 -0800)
commit2036d94a7b61ca5032ce90f2bda06afec0fe713e
treefc9f4b5ba1058e5a2fdf9ccd187766c90f5ae036
parentc5fdcec927ee31fc96e92339c3a83ac6e0725289
rcu: Rework detection of use of RCU by offline CPUs

Because newly offlined CPUs continue executing after completing the
CPU_DYING notifiers, they legitimately enter the scheduler and use
RCU while appearing to be offline.  This calls for a more sophisticated
approach as follows:

1. RCU marks the CPU online during the CPU_UP_PREPARE phase.

2. RCU marks the CPU offline during the CPU_DEAD phase.

3. Diagnostics regarding use of read-side RCU by offline CPUs use
RCU's accounting rather than the cpu_online_map.  (Note that
__call_rcu() still uses cpu_online_map to detect illegal
invocations within CPU_DYING notifiers.)

4. Offline CPUs are prevented from hanging the system by
force_quiescent_state(), which pays attention to cpu_online_map.
Some additional work (in a later commit) will be needed to
guarantee that force_quiescent_state() waits a full jiffy before
assuming that a CPU is offline, for example, when called from
idle entry.  (This commit also makes the one-jiffy wait
explicit, since the old-style implicit wait can now be defeated
by RCU_FAST_NO_HZ and by rcutorture.)

This approach avoids the false positives encountered when attempting to
use more exact classification of CPU online/offline state.

Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Documentation/RCU/trace.txt
kernel/rcutree.c
kernel/rcutree.h
kernel/rcutree_plugin.h
kernel/rcutree_trace.c