]> git.karo-electronics.de Git - karo-tx-linux.git/commit
rcu: Permit RCU_NONIDLE() to be used from interrupt context
authorPaul E. McKenney <paul.mckenney@linaro.org>
Tue, 31 Jul 2012 17:12:48 +0000 (10:12 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 4 Sep 2012 23:20:52 +0000 (16:20 -0700)
commit5dc57c8027996da5248c8e2d6c1d854cf88ca86d
tree5b70480fc5c9b0b5493c3eb22582492c66d11772
parent85393ae4474772c8066b12f9f57991e5aeb28d94
rcu: Permit RCU_NONIDLE() to be used from interrupt context

There is a need to use RCU from interrupt context, but either before
rcu_irq_enter() is called or after rcu_irq_exit() is called.  If the
interrupt occurs from idle, then lockdep-RCU will complain about such
uses, as they appear to be illegal uses of RCU from the idle loop.
In other environments, RCU_NONIDLE() could be used to properly protect
the use of RCU, but RCU_NONIDLE() currently cannot be invoked except
from process context.

This commit therefore modifies RCU_NONIDLE() to permit its use more
globally.

It also exports rcu_irq_exit() and rcu_irq_enter() in order to avoid
build errors.  The need for this is a bit counter-intuitive, hence this
explanation from Steven Rostedt:

Because some trace events happen inside the idle loop after rcu
has "shutdown", we needed to create "trace_foo_rcuidle()" handlers
that can handle this condition. That is, for every trace_foo()
static inline (used at the tracepoint location), there exists a
static inline trace_foo_rcuidle(), that looks something like this:

static inline void trace_##name##_rcuidle(proto) {
if (static_key_false(&__tracepoint_##name.key)) {
rcu_idle_exit();
__DO_TRACE();
rcu_idle_enter();
}
}

Although these calls are never used by module code, because they
are static inlines, they are still defined for all tracepoints,
kernel tracepoints as well as module tracepoints. And thus,
need the export :-(

Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
include/linux/rcupdate.h
kernel/rcutiny.c
kernel/rcutree.c