[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4] xen: disable non-boot VCPUs during suspend
From: David Vrabel <david.vrabel@xxxxxxxxxx> syscore_suspend() and syscore_resume() expect there to be only one online CPU. e.g., hrtimers_resume() only triggers events for the current CPU. Xen's suspend path was leaving all VCPUs online and then attempting to fixup problems afterwards (e.g., with an explicit call to clock_was_set() to trigger pending high resolution timers). Instead, disable non-boot CPUs before calling stop_machine() and reenable them afterwards. This is then similar to what the kexec code does before and after a kexec jump (see kernel_kexec() in kernel/kexec.c). Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> --- drivers/xen/manage.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 412b96c..596e55a 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c @@ -148,8 +148,19 @@ static void do_suspend(void) si.post = &xen_post_suspend; } + /* + * syscore_suspend() and syscore_resume() called in + * xen_suspend() above, assume that only the boot CPU is + * online. + */ + err = disable_nonboot_cpus(); + if (err) + goto out_resume; + err = stop_machine(xen_suspend, &si, cpumask_of(0)); + enable_nonboot_cpus(); + dpm_resume_start(si.cancelled ? PMSG_THAW : PMSG_RESTORE); if (err) { @@ -166,9 +177,6 @@ out_resume: dpm_resume_end(si.cancelled ? PMSG_THAW : PMSG_RESTORE); - /* Make sure timer events get retriggered on all CPUs */ - clock_was_set(); - out_thaw: #ifdef CONFIG_PREEMPT thaw_processes(); -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |