From 5a61060931959f3ee6ee4f3ae4e6adfe3d9fd7cb Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 24 Mar 2010 11:13:17 +0000 Subject: [PATCH] x86: Fix possible S3 suspend hangs It is possible for cpu to become offlined before irq disabled in idle loop, which will cause this cpu stay in C state and can't wakeup to play dead. Signed-off-by: Wei Gang Signed-off-by: Yu Ke xen-unstable changeset: 21030:bce90bb3ce2c xen-unstable date: Mon Mar 15 13:17:38 2010 +0000 --- xen/arch/x86/acpi/cpu_idle.c | 3 ++- xen/arch/x86/domain.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index 5e7373676..448ef12bd 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -209,7 +209,8 @@ static void acpi_processor_idle(void) */ local_irq_disable(); - if ( softirq_pending(smp_processor_id()) ) + if ( softirq_pending(smp_processor_id()) || + cpu_is_offline(smp_processor_id()) ) { local_irq_enable(); sched_tick_resume(); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 974ec8004..7dcbe1e6a 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -81,7 +81,8 @@ static void continue_nonidle_domain(struct vcpu *v) static void default_idle(void) { local_irq_disable(); - if ( !softirq_pending(smp_processor_id()) ) + if ( !softirq_pending(smp_processor_id()) && + cpu_online(smp_processor_id()) ) safe_halt(); else local_irq_enable(); -- 2.39.5