Message ID | 20210531140347.42681-3-krzysztof.kozlowski@canonical.com |
---|---|
State | Superseded |
Headers | show |
Series | x86/kvm: fixes for hibernation | expand |
On 31/05/21 16:03, Krzysztof Kozlowski wrote: > From: Vitaly Kuznetsov <vkuznets@redhat.com> > > commit c02027b5742b5aa804ef08a4a9db433295533046 upstream. > > Currenly, we disable kvmclock from machine_shutdown() hook and this > only happens for boot CPU. We need to disable it for all CPUs to > guard against memory corruption e.g. on restore from hibernate. > > Note, writing '0' to kvmclock MSR doesn't clear memory location, it > just prevents hypervisor from updating the location so for the short > while after write and while CPU is still alive, the clock remains usable > and correct so we don't need to switch to some other clocksource. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> > Message-Id: <20210414123544.1060604-4-vkuznets@redhat.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Andrea Righi <andrea.righi@canonical.com> > Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> > --- > arch/x86/include/asm/kvm_para.h | 4 ++-- > arch/x86/kernel/kvm.c | 1 + > arch/x86/kernel/kvmclock.c | 5 +---- > 3 files changed, 4 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h > index 9b4df6eaa11a..a617fd360023 100644 > --- a/arch/x86/include/asm/kvm_para.h > +++ b/arch/x86/include/asm/kvm_para.h > @@ -6,8 +6,6 @@ > #include <asm/alternative.h> > #include <uapi/asm/kvm_para.h> > > -extern void kvmclock_init(void); > - > #ifdef CONFIG_KVM_GUEST > bool kvm_check_and_clear_guest_paused(void); > #else > @@ -85,6 +83,8 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, > } > > #ifdef CONFIG_KVM_GUEST > +void kvmclock_init(void); > +void kvmclock_disable(void); > bool kvm_para_available(void); > unsigned int kvm_arch_para_features(void); > unsigned int kvm_arch_para_hints(void); > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c > index 82a2756e0ef8..d6f04d32dec0 100644 > --- a/arch/x86/kernel/kvm.c > +++ b/arch/x86/kernel/kvm.c > @@ -436,6 +436,7 @@ static void kvm_guest_cpu_offline(void) > wrmsrl(MSR_KVM_PV_EOI_EN, 0); > kvm_pv_disable_apf(); > apf_task_wake_all(); > + kvmclock_disable(); > } > > static int kvm_cpu_online(unsigned int cpu) > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > index 904494b924c1..bd3962953f78 100644 > --- a/arch/x86/kernel/kvmclock.c > +++ b/arch/x86/kernel/kvmclock.c > @@ -214,11 +214,9 @@ static void kvm_crash_shutdown(struct pt_regs *regs) > } > #endif > > -static void kvm_shutdown(void) > +void kvmclock_disable(void) > { > native_write_msr(msr_kvm_system_time, 0, 0); > - kvm_disable_steal_time(); > - native_machine_shutdown(); > } > > static void __init kvmclock_init_mem(void) > @@ -346,7 +344,6 @@ void __init kvmclock_init(void) > #endif > x86_platform.save_sched_clock_state = kvm_save_sched_clock_state; > x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state; > - machine_ops.shutdown = kvm_shutdown; > #ifdef CONFIG_KEXEC_CORE > machine_ops.crash_shutdown = kvm_crash_shutdown; > #endif > Acked-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h index 9b4df6eaa11a..a617fd360023 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -6,8 +6,6 @@ #include <asm/alternative.h> #include <uapi/asm/kvm_para.h> -extern void kvmclock_init(void); - #ifdef CONFIG_KVM_GUEST bool kvm_check_and_clear_guest_paused(void); #else @@ -85,6 +83,8 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1, } #ifdef CONFIG_KVM_GUEST +void kvmclock_init(void); +void kvmclock_disable(void); bool kvm_para_available(void); unsigned int kvm_arch_para_features(void); unsigned int kvm_arch_para_hints(void); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 82a2756e0ef8..d6f04d32dec0 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -436,6 +436,7 @@ static void kvm_guest_cpu_offline(void) wrmsrl(MSR_KVM_PV_EOI_EN, 0); kvm_pv_disable_apf(); apf_task_wake_all(); + kvmclock_disable(); } static int kvm_cpu_online(unsigned int cpu) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 904494b924c1..bd3962953f78 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -214,11 +214,9 @@ static void kvm_crash_shutdown(struct pt_regs *regs) } #endif -static void kvm_shutdown(void) +void kvmclock_disable(void) { native_write_msr(msr_kvm_system_time, 0, 0); - kvm_disable_steal_time(); - native_machine_shutdown(); } static void __init kvmclock_init_mem(void) @@ -346,7 +344,6 @@ void __init kvmclock_init(void) #endif x86_platform.save_sched_clock_state = kvm_save_sched_clock_state; x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state; - machine_ops.shutdown = kvm_shutdown; #ifdef CONFIG_KEXEC_CORE machine_ops.crash_shutdown = kvm_crash_shutdown; #endif