Skip to content

Check for use of RCU from dyntick-idle mode

Paul E. McKenney lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest6 patches 5 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/6rcu: Detect illegal rcu dereference in extended quiescent stateinclude/linux/rcupdate.h kernel/rcupdate.c kernel/rcutiny.c +1 more+82 -10 replies
2/6rcu: Inform the user about dynticks-idle mode on PROVE_RCU warningkernel/lockdep.c+20 -00 replies
3/6rcu: Warn when rcu_read_lock() is used in extended quiescent stateinclude/linux/rcupdate.h+42 -100 replies
4/6rcu: Remove one layer of abstraction from PROVE_RCU checkinginclude/linux/rcupdate.h+8 -450 replies
5/6rcu: Warn when srcu_read_lock() is used in an extended quiescent stateinclude/linux/srcu.h+15 -100 replies
6/6rcu: Make srcu_read_lock_held() call common lockdep-enabled functioninclude/linux/srcu.h+4 -10 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH tip/core/rcu 0/6] Check for use of RCU from dyntick-idle mode

Hello!

This set of patches adds checks for use of RCU from "extended quiescent states" such as dyntick-idle mode. Such use is grossly illegal because RCU by definition ignores CPUs that are in extended quiescent states. In the case of dyntick-idle mode, the only way for RCU to avoid ignoring such CPUs would be to wake them up periodically, which would defeat the whole purpose of dyntick-idle mode.

The good news is that Frederic got this effort started. The bad news is that there are several cases where RCU read-side critical sections appear in dyntick-idle mode. Frederic is working on a solution, but because there is no point in giving warnings in cases where there is no known fix, I will not push these patches until a fix is available. (The most likely fix is to move the code that informs RCU of entry to and exit from dyntick-idle mode into the arch-specific idle loops, which would legitimize current RCU usage -- and potentially simplify RCU's quiescent-state detection.)

The individual patches are as follows:

1. Make rcu_read_lock_held(), rcu_read_lock_sched_held(),
and rcu_read_lock_bh_held() invoke a new rcu_check_extended_qs() function to check for calls from extended quiescent states, courtesy of Frederic Weisbecker.
2. Make lockdep RCU splats call out use from within extended
quiescent states, also courtesy of Frederic Weisbecker.
3. Make rcu_read_lock(), rcu_read_lock_sched(), and
rcu_read_lock_bh() also check for (illegal) use from within an extended quiescent state, again courtesy of Frederic Weisbecker.
4. Remove an unnecessary level of abstraction from the PROVE_RCU
checking.
5. Warn when srcu_read_lock() and srcu_read_lock_held() are called
from within an extended quiescent state.
6. Make srcu_read_lock_held() invoke the debug_lockdep_rcu_enabled()
common function that determines whether or not RCU lockdep splats are appropriate.

These changes are also available on the subject-to-rebase branch in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu.git eqscheck.2011.07.08a

Thanx, Paul

------------------------------------------------------------------------

 b/include/linux/rcupdate.h |   36 +++++++++++++++
 b/include/linux/srcu.h     |   25 ++++++----
 b/kernel/lockdep.c         |   20 ++++++++
 b/kernel/rcupdate.c        |   17 ++++++-
 b/kernel/rcutiny.c         |   14 ++++++
 b/kernel/rcutree.c         |   16 ++++++
 include/linux/rcupdate.h   |  105 +++++++++++++++++++++------------------------
 include/linux/srcu.h       |    5 +-
 8 files changed, 171 insertions(+), 67 deletions(-)