RE: [PATCH v9 05/12] x86, hotplug, suspend: Online CPU0 for suspendor hibernate

From: Yu, Fenghua
Date: Wed Oct 17 2012 - 14:29:04 EST


> From: Srivatsa S. Bhat [mailto:srivatsa.bhat@xxxxxxxxxxxxxxxxxx]
> On 10/16/2012 02:20 AM, Rafael J. Wysocki wrote:
> > On Friday 12 of October 2012 09:09:42 Fenghua Yu wrote:
> >> From: Fenghua Yu <fenghua.yu@xxxxxxxxx>
> >>
> >> Because x86 BIOS requires CPU0 to resume from sleep, suspend or
> hibernate can't
> >> be executed if CPU0 is detected offline. To make suspend or
> hibernate and
> >> further resume succeed, CPU0 must be online.
> >>
> >> Signed-off-by: Fenghua Yu <fenghua.yu@xxxxxxxxx>
> >> ---
> >> 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 218cdb1..adde775 100644
> >> --- a/arch/x86/power/cpu.c
> >> +++ b/arch/x86/power/cpu.c
> >> @@ -237,3 +237,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) {
> >> + pr_warn("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);
> >> +}
> >> +
> >
> > I wonder if there's anything preventing CPU0 from becoming offline
> after you've
> > done this check and before user space is frozen?
> >
>
> Hi Rafael,
>
> bsp_pm_callback runs as a low priority notifier callback, specifically
> with lower
> priority than the cpu_hotplug_pm_callback (as mentioned in the comment
> below).
> And cpu_hotplug_pm_callback disables regular CPU hotplug (till the
> suspend/resume
> sequence is complete).. So there is no chance for CPU0 to become
> offline after that.

Bhat is right here. There is no functionality issue here.

bsp_check() is protected by cpu_hotplug_disable which is set before
bsp_pm_callback and cleared after it. There is no chance for CPU0
to be offline after that.

Thanks.

-Fenghua


èº{.nÇ+‰·Ÿ®‰­†+%ŠËlzwm…ébëæìr¸›zX§»®w¥Š{ayºÊÚë,j­¢f£¢·hš‹àz¹®w¥¢¸ ¢·¦j:+v‰¨ŠwèjØm¶Ÿÿ¾«‘êçzZ+ƒùšŽŠÝj"ú!¶iO•æ¬z·švØ^¶m§ÿðà nÆàþY&—