diff options
| author | Paul E. McKenney <paul.mckenney@linaro.org> | 2012-02-02 18:42:04 -0500 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-02-21 12:06:13 -0500 |
| commit | 8a2ecf474d3ee8dd5d001490349e422cec52f39f (patch) | |
| tree | aa706d632a059dd10d9305cc6abbea5889a839d9 /kernel | |
| parent | 29e37d814188ac8d60f2120583704d3ef6d634b4 (diff) | |
rcu: Add RCU_NONIDLE() for idle-loop RCU read-side critical sections
RCU, RCU-bh, and RCU-sched read-side critical sections are forbidden
in the inner idle loop, that is, between the rcu_idle_enter() and the
rcu_idle_exit() -- RCU will happily ignore any such read-side critical
sections. However, things like powertop need tracepoints in the inner
idle loop.
This commit therefore provides an RCU_NONIDLE() macro that can be used to
wrap code in the idle loop that requires RCU read-side critical sections.
Suggested-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>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Acked-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/rcutiny.c | 2 | ||||
| -rw-r--r-- | kernel/rcutree.c | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c index c8b0e1582c04..37a5444204d2 100644 --- a/kernel/rcutiny.c +++ b/kernel/rcutiny.c | |||
| @@ -97,6 +97,7 @@ void rcu_idle_enter(void) | |||
| 97 | rcu_idle_enter_common(oldval); | 97 | rcu_idle_enter_common(oldval); |
| 98 | local_irq_restore(flags); | 98 | local_irq_restore(flags); |
| 99 | } | 99 | } |
| 100 | EXPORT_SYMBOL_GPL(rcu_idle_enter); | ||
| 100 | 101 | ||
| 101 | /* | 102 | /* |
| 102 | * Exit an interrupt handler towards idle. | 103 | * Exit an interrupt handler towards idle. |
| @@ -153,6 +154,7 @@ void rcu_idle_exit(void) | |||
| 153 | rcu_idle_exit_common(oldval); | 154 | rcu_idle_exit_common(oldval); |
| 154 | local_irq_restore(flags); | 155 | local_irq_restore(flags); |
| 155 | } | 156 | } |
| 157 | EXPORT_SYMBOL_GPL(rcu_idle_exit); | ||
| 156 | 158 | ||
| 157 | /* | 159 | /* |
| 158 | * Enter an interrupt handler, moving away from idle. | 160 | * Enter an interrupt handler, moving away from idle. |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 92b47760edf3..eacc10b03531 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -402,6 +402,7 @@ void rcu_idle_enter(void) | |||
| 402 | rcu_idle_enter_common(rdtp, oldval); | 402 | rcu_idle_enter_common(rdtp, oldval); |
| 403 | local_irq_restore(flags); | 403 | local_irq_restore(flags); |
| 404 | } | 404 | } |
| 405 | EXPORT_SYMBOL_GPL(rcu_idle_enter); | ||
| 405 | 406 | ||
| 406 | /** | 407 | /** |
| 407 | * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle | 408 | * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle |
| @@ -493,6 +494,7 @@ void rcu_idle_exit(void) | |||
| 493 | rcu_idle_exit_common(rdtp, oldval); | 494 | rcu_idle_exit_common(rdtp, oldval); |
| 494 | local_irq_restore(flags); | 495 | local_irq_restore(flags); |
| 495 | } | 496 | } |
| 497 | EXPORT_SYMBOL_GPL(rcu_idle_exit); | ||
| 496 | 498 | ||
| 497 | /** | 499 | /** |
| 498 | * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle | 500 | * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle |
