| From 5b0753a90b7a98bc613c3767e9263a1a76d4f900 Mon Sep 17 00:00:00 2001 |
| From: Frederic Weisbecker <fweisbec@gmail.com> |
| Date: Wed, 22 Aug 2012 17:27:34 +0200 |
| Subject: mn10300: Add missing RCU idle APIs on idle loop |
| |
| From: Frederic Weisbecker <fweisbec@gmail.com> |
| |
| commit 5b0753a90b7a98bc613c3767e9263a1a76d4f900 upstream. |
| |
| In the old times, the whole idle task was considered |
| as an RCU quiescent state. But as RCU became more and |
| more successful overtime, some RCU read side critical |
| section have been added even in the code of some |
| architectures idle tasks, for tracing for example. |
| |
| So nowadays, rcu_idle_enter() and rcu_idle_exit() must |
| be called by the architecture to tell RCU about the part |
| in the idle loop that doesn't make use of rcu read side |
| critical sections, typically the part that puts the CPU |
| in low power mode. |
| |
| This is necessary for RCU to find the quiescent states in |
| idle in order to complete grace periods. |
| |
| Add this missing pair of calls in the mn10300's idle loop. |
| |
| Reported-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> |
| Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> |
| Cc: David Howells <dhowells@redhat.com> |
| Cc: Koichi Yasutake <yasutake.koichi@jp.panasonic.com> |
| Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> |
| Acked-by: David Howells <dhowells@redhat.com> |
| Reviewed-by: Josh Triplett <josh@joshtriplett.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/mn10300/kernel/process.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/arch/mn10300/kernel/process.c |
| +++ b/arch/mn10300/kernel/process.c |
| @@ -25,6 +25,7 @@ |
| #include <linux/err.h> |
| #include <linux/fs.h> |
| #include <linux/slab.h> |
| +#include <linux/rcupdate.h> |
| #include <asm/uaccess.h> |
| #include <asm/pgtable.h> |
| #include <asm/io.h> |
| @@ -107,6 +108,7 @@ void cpu_idle(void) |
| { |
| /* endless idle loop with no priority at all */ |
| for (;;) { |
| + rcu_idle_enter(); |
| while (!need_resched()) { |
| void (*idle)(void); |
| |
| @@ -121,6 +123,7 @@ void cpu_idle(void) |
| } |
| idle(); |
| } |
| + rcu_idle_exit(); |
| |
| schedule_preempt_disabled(); |
| } |