Message ID | 20210520133611.39540-3-andrea.righi@canonical.com |
---|---|
State | New |
Headers | show |
Series | kvm: properly tear down PV features on hibernate | expand |
On 20/05/2021 09:36, Andrea Righi wrote: > From: Vitaly Kuznetsov <vkuznets@redhat.com> > > BugLink: https://bugs.launchpad.net/bugs/1920944 > > Various PV features (Async PF, PV EOI, steal time) work through memory > shared with hypervisor and when we restore from hibernation we must > properly teardown all these features to make sure hypervisor doesn't > write to stale locations after we jump to the previously hibernated kernel > (which can try to place anything there). For secondary CPUs the job is > already done by kvm_cpu_down_prepare(), register syscore ops to do > the same for boot CPU. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> > Message-Id: <20210414123544.1060604-3-vkuznets@redhat.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > (backported from 8b79feffeca28c5459458fe78676b081e87c93a4) Same as for your v3 - this differs significantly against mainline, so it should be mentioned what changed. The kvm_guest_cpu_offline() location looks now wrong. Best regards, Krzysztof
On 20/05/2021 13:21, Krzysztof Kozlowski wrote: > On 20/05/2021 09:36, Andrea Righi wrote: >> From: Vitaly Kuznetsov <vkuznets@redhat.com> >> >> BugLink: https://bugs.launchpad.net/bugs/1920944 >> >> Various PV features (Async PF, PV EOI, steal time) work through memory >> shared with hypervisor and when we restore from hibernation we must >> properly teardown all these features to make sure hypervisor doesn't >> write to stale locations after we jump to the previously hibernated kernel >> (which can try to place anything there). For secondary CPUs the job is >> already done by kvm_cpu_down_prepare(), register syscore ops to do >> the same for boot CPU. >> >> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> >> Message-Id: <20210414123544.1060604-3-vkuznets@redhat.com> >> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >> (backported from 8b79feffeca28c5459458fe78676b081e87c93a4) > > Same as for your v3 - this differs significantly against mainline, so it > should be mentioned what changed. The kvm_guest_cpu_offline() location > looks now wrong. Let it be a nack as it fails to build with !SMP because of above: ../arch/x86/kernel/kvm.c: In function 'kvm_suspend': ../arch/x86/kernel/kvm.c:619:2: error: implicit declaration of function 'kvm_guest_cpu_offline' [-Werror=implicit-function-declaration] kvm_guest_cpu_offline(false); ^ ../arch/x86/kernel/kvm.c: In function 'kvm_resume': ../arch/x86/kernel/kvm.c:626:2: error: implicit declaration of function 'kvm_cpu_online' [-Werror=implicit-function-declaration] kvm_cpu_online(raw_smp_processor_id()); ^ Best regards, Krzysztof
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index ec7e4b9f50a5..7bf47e41bb46 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -24,6 +24,7 @@ #include <linux/debugfs.h> #include <linux/nmi.h> #include <linux/swait.h> +#include <linux/syscore_ops.h> #include <asm/timer.h> #include <asm/cpu.h> #include <asm/traps.h> @@ -558,17 +559,21 @@ static void kvm_guest_cpu_offline(void) static int kvm_cpu_online(unsigned int cpu) { - local_irq_disable(); + unsigned long flags; + + local_irq_save(flags); kvm_guest_cpu_init(); - local_irq_enable(); + local_irq_restore(flags); return 0; } static int kvm_cpu_down_prepare(unsigned int cpu) { - local_irq_disable(); + unsigned long flags; + + local_irq_save(flags); kvm_guest_cpu_offline(); - local_irq_enable(); + local_irq_restore(flags); return 0; } #endif @@ -606,6 +611,23 @@ static void kvm_flush_tlb_others(const struct cpumask *cpumask, native_flush_tlb_others(flushmask, info); } +static int kvm_suspend(void) +{ + kvm_guest_cpu_offline(); + + return 0; +} + +static void kvm_resume(void) +{ + kvm_cpu_online(raw_smp_processor_id()); +} + +static struct syscore_ops kvm_syscore_ops = { + .suspend = kvm_suspend, + .resume = kvm_resume, +}; + static void __init kvm_guest_init(void) { int i; @@ -649,6 +671,8 @@ static void __init kvm_guest_init(void) kvm_guest_cpu_init(); #endif + register_syscore_ops(&kvm_syscore_ops); + /* * Hard lockup detection is enabled by default. Disable it, as guests * can get false positives too easily, for example if the host is