diff options
author | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2015-12-02 12:10:48 -0500 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2015-12-02 17:17:17 +0000 |
commit | de0afc9bdeeadaa998797d2333c754bf9f4d5dcf (patch) | |
tree | 7589aa1fb73dfe2ac28e748a9cf4f68391023daf /arch | |
parent | 3de88d622fd68bd4dbee0f80168218b23f798fd0 (diff) | |
download | linux-stable-de0afc9bdeeadaa998797d2333c754bf9f4d5dcf.tar.gz linux-stable-de0afc9bdeeadaa998797d2333c754bf9f4d5dcf.tar.bz2 linux-stable-de0afc9bdeeadaa998797d2333c754bf9f4d5dcf.zip |
xen: Resume PMU from non-atomic context
Resuming PMU currently triggers a warning from ___might_sleep() (assuming
CONFIG_DEBUG_ATOMIC_SLEEP is set) when xen_pmu_init() allocates GFP_KERNEL
page because we are in state resembling atomic context.
Move resuming PMU to xen_arch_resume() which is called in regular context.
For symmetry move suspending PMU to xen_arch_suspend() as well.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reported-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: <stable@vger.kernel.org> # 4.3
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/xen/suspend.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index feddabdab448..3705eabd7e22 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c @@ -68,26 +68,16 @@ static void xen_pv_post_suspend(int suspend_cancelled) void xen_arch_pre_suspend(void) { - int cpu; - - for_each_online_cpu(cpu) - xen_pmu_finish(cpu); - if (xen_pv_domain()) xen_pv_pre_suspend(); } void xen_arch_post_suspend(int cancelled) { - int cpu; - if (xen_pv_domain()) xen_pv_post_suspend(cancelled); else xen_hvm_post_suspend(cancelled); - - for_each_online_cpu(cpu) - xen_pmu_init(cpu); } static void xen_vcpu_notify_restore(void *data) @@ -106,10 +96,20 @@ static void xen_vcpu_notify_suspend(void *data) void xen_arch_resume(void) { + int cpu; + on_each_cpu(xen_vcpu_notify_restore, NULL, 1); + + for_each_online_cpu(cpu) + xen_pmu_init(cpu); } void xen_arch_suspend(void) { + int cpu; + + for_each_online_cpu(cpu) + xen_pmu_finish(cpu); + on_each_cpu(xen_vcpu_notify_suspend, NULL, 1); } |