Messages in this thread | | | Subject | Re: [PATCHv3 2/2] kvm: x86: implement KVM PM-notifier | From | Paolo Bonzini <> | Date | Thu, 10 Jun 2021 14:15:53 +0200 |
| |
On 06/06/21 04:10, Sergey Senozhatsky wrote: > Implement PM hibernation/suspend prepare notifiers so that KVM > can reliably set PVCLOCK_GUEST_STOPPED on VCPUs and properly > suspend VMs. > > Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> > --- > arch/x86/kvm/Kconfig | 1 + > arch/x86/kvm/x86.c | 36 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig > index fb8efb387aff..ac69894eab88 100644 > --- a/arch/x86/kvm/Kconfig > +++ b/arch/x86/kvm/Kconfig > @@ -43,6 +43,7 @@ config KVM > select KVM_GENERIC_DIRTYLOG_READ_PROTECT > select KVM_VFIO > select SRCU > + select HAVE_KVM_PM_NOTIFIER if PM > help > Support hosting fully virtualized guest machines using hardware > virtualization extensions. You will need a fairly recent > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index b594275d49b5..af1ab527a0cb 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -58,6 +58,7 @@ > #include <linux/sched/isolation.h> > #include <linux/mem_encrypt.h> > #include <linux/entry-kvm.h> > +#include <linux/suspend.h> > > #include <trace/events/kvm.h> > > @@ -5615,6 +5616,41 @@ static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp) > return 0; > } > > +#ifdef CONFIG_HAVE_KVM_PM_NOTIFIER > +static int kvm_arch_suspend_notifier(struct kvm *kvm) > +{ > + struct kvm_vcpu *vcpu; > + int i, ret = 0; > + > + mutex_lock(&kvm->lock); > + kvm_for_each_vcpu(i, vcpu, kvm) { > + if (!vcpu->arch.pv_time_enabled) > + continue; > + > + ret = kvm_set_guest_paused(vcpu); > + if (ret) { > + kvm_err("Failed to pause guest VCPU%d: %d\n", > + vcpu->vcpu_id, ret); > + break; > + } > + } > + mutex_unlock(&kvm->lock); > + > + return ret ? NOTIFY_BAD : NOTIFY_DONE; > +} > + > +int kvm_arch_pm_notifier(struct kvm *kvm, unsigned long state) > +{ > + switch (state) { > + case PM_HIBERNATION_PREPARE: > + case PM_SUSPEND_PREPARE: > + return kvm_arch_suspend_notifier(kvm); > + } > + > + return NOTIFY_DONE; > +} > +#endif /* CONFIG_HAVE_KVM_PM_NOTIFIER */ > + > long kvm_arch_vm_ioctl(struct file *filp, > unsigned int ioctl, unsigned long arg) > { >
Queued, thanks.
Paolo
| |