Messages in this thread Patch in this message | | | From | "Fenghua Yu" <> | Subject | [PATCH v3 7/7] x86/power/cpu.c: Don't hibernate/suspend if CPU0 is offline | Date | Wed, 9 Nov 2011 16:34:17 -0800 |
| |
From: Fenghua Yu <fenghua.yu@intel.com>
Because x86 BIOS requires CPU0 to resume from sleep, suspend or hibernate can't be executed if CPU0 is detected offline.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> --- arch/x86/power/cpu.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index f10c0af..a4ec084 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -236,3 +236,47 @@ void restore_processor_state(void) #ifdef CONFIG_X86_32 EXPORT_SYMBOL(restore_processor_state); #endif + +/* + * When bsp_check() is called in hibernate and suspend, cpu hotplug + * is disabled already. So it's unnessary to handle race condition between + * cpumask query and cpu hotplug. + */ +static int bsp_check(void) +{ + if (cpumask_first(cpu_online_mask) != 0) { + printk(KERN_WARNING "CPU0 is offline.\n"); + return -ENODEV; + } + + return 0; +} + +static int bsp_pm_callback(struct notifier_block *nb, unsigned long action, + void *ptr) +{ + int ret = 0; + + switch (action) { + case PM_SUSPEND_PREPARE: + case PM_HIBERNATION_PREPARE: + ret = bsp_check(); + break; + default: + break; + } + return notifier_from_errno(ret); +} + +static int __init bsp_pm_check_init(void) +{ + /* + * Set this bsp_pm_callback as lower priority than + * cpu_hotplug_pm_callback. So cpu_hotplug_pm_callback will be called + * earlier to disable cpu hotplug before bsp online check. + */ + pm_notifier(bsp_pm_callback, -INT_MAX); + return 0; +} + +core_initcall(bsp_pm_check_init); -- 1.6.0.3
| |