[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/S3: add cache flush on secondary CPUs before going to sleep
# HG changeset patch # User Ben Guthro <ben@xxxxxxxxxx> # Date 1348555094 -7200 # Node ID c8d65d91a6f20fa7fae905bbf172e59b335d6371 # Parent b49f7bf52fa92626517386cba89350243b808871 x86/S3: add cache flush on secondary CPUs before going to sleep Secondary CPUs, between doing their final memory writes (particularly updating cpu_initialized) and getting a subsequent INIT, may not write back all modified data. The INIT itself then causes those modifications to be lost, so in the cpu_initialized case the CPU would find itself already initialized, (intentionally) entering an infinite loop instead of actually coming online. Signed-off-by: Ben Guthro <ben@xxxxxxxxxx> Make acpi_dead_idle() call default_dead_idle() rather than duplicating the logic there. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> Committed-by: Jan Beulich <jbeulich@xxxxxxxx> --- diff -r b49f7bf52fa9 -r c8d65d91a6f2 xen/arch/x86/acpi/cpu_idle.c --- a/xen/arch/x86/acpi/cpu_idle.c Tue Sep 25 08:36:33 2012 +0200 +++ b/xen/arch/x86/acpi/cpu_idle.c Tue Sep 25 08:38:14 2012 +0200 @@ -659,8 +659,7 @@ void acpi_dead_idle(void) } default_halt: - for ( ; ; ) - halt(); + default_dead_idle(); } int cpuidle_init_cpu(unsigned int cpu) diff -r b49f7bf52fa9 -r c8d65d91a6f2 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Tue Sep 25 08:36:33 2012 +0200 +++ b/xen/arch/x86/domain.c Tue Sep 25 08:38:14 2012 +0200 @@ -45,6 +45,7 @@ #include <asm/desc.h> #include <asm/i387.h> #include <asm/xstate.h> +#include <asm/cpuidle.h> #include <asm/mpspec.h> #include <asm/ldt.h> #include <asm/fixmap.h> @@ -64,7 +65,6 @@ DEFINE_PER_CPU(struct vcpu *, curr_vcpu) DEFINE_PER_CPU(unsigned long, cr4); static void default_idle(void); -static void default_dead_idle(void); void (*pm_idle) (void) __read_mostly = default_idle; void (*dead_idle) (void) __read_mostly = default_dead_idle; @@ -82,8 +82,14 @@ static void default_idle(void) local_irq_enable(); } -static void default_dead_idle(void) +void default_dead_idle(void) { + /* + * When going into S3, without flushing caches modified data may be + * held by the CPUs spinning here indefinitely, and get discarded by + * a subsequent INIT. + */ + wbinvd(); for ( ; ; ) halt(); } diff -r b49f7bf52fa9 -r c8d65d91a6f2 xen/include/asm-x86/cpuidle.h --- a/xen/include/asm-x86/cpuidle.h Tue Sep 25 08:36:33 2012 +0200 +++ b/xen/include/asm-x86/cpuidle.h Tue Sep 25 08:38:14 2012 +0200 @@ -18,6 +18,7 @@ extern uint64_t (*cpuidle_get_tick)(void int mwait_idle_init(struct notifier_block *); int cpuidle_init_cpu(unsigned int cpu); +void default_dead_idle(void); void acpi_dead_idle(void); void trace_exit_reason(u32 *irq_traced); void update_idle_stats(struct acpi_processor_power *, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |