| From 761a5d96c87fccab8a53f8c8c3240d8dcdb1bb19 Mon Sep 17 00:00:00 2001 |
| From: Len Brown <len.brown@intel.com> |
| Date: Fri, 1 Apr 2011 18:28:35 -0400 |
| Subject: cpuidle: replace xen access to x86 pm_idle and default_idle |
| |
| When a Xen Dom0 kernel boots on a hypervisor, it gets access |
| to the raw-hardware ACPI tables. While it parses the idle tables |
| for the hypervisor's beneift, it uses HLT for its own idle. |
| |
| Rather than have xen scribble on pm_idle and access default_idle, |
| have it simply disable_cpuidle() so acpi_idle will not load and |
| architecture default HLT will be used. |
| |
| cc: xen-devel@lists.xensource.com |
| Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Acked-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Len Brown <len.brown@intel.com> |
| (cherry picked from commit d91ee5863b71e8c90eaf6035bff3078a85e2e7b5) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| arch/x86/xen/setup.c | 3 ++- |
| drivers/cpuidle/cpuidle.c | 4 ++++ |
| include/linux/cpuidle.h | 2 ++ |
| 3 files changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/xen/setup.c |
| +++ b/arch/x86/xen/setup.c |
| @@ -9,6 +9,7 @@ |
| #include <linux/mm.h> |
| #include <linux/pm.h> |
| #include <linux/memblock.h> |
| +#include <linux/cpuidle.h> |
| |
| #include <asm/elf.h> |
| #include <asm/vdso.h> |
| @@ -460,7 +461,7 @@ void __init xen_arch_setup(void) |
| #ifdef CONFIG_X86_32 |
| boot_cpu_data.hlt_works_ok = 1; |
| #endif |
| - pm_idle = default_idle; |
| + disable_cpuidle(); |
| boot_option_idle_override = IDLE_HALT; |
| |
| fiddle_vdso(); |
| --- a/drivers/cpuidle/cpuidle.c |
| +++ b/drivers/cpuidle/cpuidle.c |
| @@ -34,6 +34,10 @@ int cpuidle_disabled(void) |
| { |
| return off; |
| } |
| +void disable_cpuidle(void) |
| +{ |
| + off = 1; |
| +} |
| |
| #if defined(CONFIG_ARCH_HAS_CPU_IDLE_WAIT) |
| static void cpuidle_kick_cpus(void) |
| --- a/include/linux/cpuidle.h |
| +++ b/include/linux/cpuidle.h |
| @@ -122,6 +122,7 @@ struct cpuidle_driver { |
| }; |
| |
| #ifdef CONFIG_CPU_IDLE |
| +extern void disable_cpuidle(void); |
| |
| extern int cpuidle_register_driver(struct cpuidle_driver *drv); |
| struct cpuidle_driver *cpuidle_get_driver(void); |
| @@ -135,6 +136,7 @@ extern int cpuidle_enable_device(struct |
| extern void cpuidle_disable_device(struct cpuidle_device *dev); |
| |
| #else |
| +static inline void disable_cpuidle(void) { } |
| |
| static inline int cpuidle_register_driver(struct cpuidle_driver *drv) |
| {return -ENODEV; } |