[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3E5A0FA7E9CA944F9D5414FEC6C7122030B1A8DC@ORSMSX105.amr.corp.intel.com>
Date: Wed, 17 Oct 2012 18:29:12 +0000
From: "Yu, Fenghua" <fenghua.yu@...el.com>
To: "Srivatsa S. Bhat" <srivatsa.bhat@...ux.vnet.ibm.com>,
"Rafael J. Wysocki" <rjw@...k.pl>
CC: Ingo Molnar <mingo@...e.hu>, Thomas Gleixner <tglx@...utronix.de>,
H Peter Anvin <hpa@...or.com>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Andrew Morton <akpm@...ux-foundation.org>,
"Mallick, Asit K" <asit.k.mallick@...el.com>,
"Luck, Tony" <tony.luck@...el.com>,
Arjan Dan De Ven <arjan@...ux.intel.com>,
"Siddha, Suresh B" <suresh.b.siddha@...el.com>,
"Brown, Len" <len.brown@...el.com>,
Randy Dunlap <rdunlap@...otime.net>,
Chen Gong <gong.chen@...ux.intel.com>,
linux-kernel <linux-kernel@...r.kernel.org>,
linux-pm <linux-pm@...r.kernel.org>, x86 <x86@...nel.org>
Subject: RE: [PATCH v9 05/12] x86, hotplug, suspend: Online CPU0 for suspend
or hibernate
> From: Srivatsa S. Bhat [mailto:srivatsa.bhat@...ux.vnet.ibm.com]
> 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@...el.com>
> >>
> >> 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@...el.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 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
Powered by blists - more mailing lists