| From 93482f4ef1093f5961a63359a34612183d6beea0 Mon Sep 17 00:00:00 2001 |
| From: "Paul E. McKenney" <paul.mckenney@linaro.org> |
| Date: Fri, 24 Aug 2012 13:22:13 -0700 |
| Subject: ia64: Add missing RCU idle APIs on idle loop |
| |
| From: "Paul E. McKenney" <paul.mckenney@linaro.org> |
| |
| commit 93482f4ef1093f5961a63359a34612183d6beea0 upstream. |
| |
| Traditionally, the entire idle task served as an RCU quiescent state. |
| But when RCU read side critical sections started appearing within the |
| idle loop, this traditional strategy became untenable. The fix was to |
| create new RCU APIs named rcu_idle_enter() and rcu_idle_exit(), which |
| must be called by each architecture's idle loop so that RCU can tell |
| when it is safe to ignore a given idle CPU. |
| |
| Unfortunately, this fix was never applied to ia64, a shortcoming remedied |
| by this commit. |
| |
| Reported by: Tony Luck <tony.luck@intel.com> |
| Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> |
| Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> |
| Tested by: Tony Luck <tony.luck@intel.com> |
| Reviewed-by: Josh Triplett <josh@joshtriplett.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/ia64/kernel/process.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/arch/ia64/kernel/process.c |
| +++ b/arch/ia64/kernel/process.c |
| @@ -29,6 +29,7 @@ |
| #include <linux/kdebug.h> |
| #include <linux/utsname.h> |
| #include <linux/tracehook.h> |
| +#include <linux/rcupdate.h> |
| |
| #include <asm/cpu.h> |
| #include <asm/delay.h> |
| @@ -301,6 +302,7 @@ cpu_idle (void) |
| |
| /* endless idle loop with no priority at all */ |
| while (1) { |
| + rcu_idle_enter(); |
| if (can_do_pal_halt) { |
| current_thread_info()->status &= ~TS_POLLING; |
| /* |
| @@ -331,6 +333,7 @@ cpu_idle (void) |
| normal_xtp(); |
| #endif |
| } |
| + rcu_idle_exit(); |
| schedule_preempt_disabled(); |
| check_pgt_cache(); |
| if (cpu_is_offline(cpu)) |