On Sat, 05 Jun 2021 03:30:42 +0100, Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> 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@xxxxxxxxxxxx> > --- > arch/x86/kvm/Kconfig | 1 + > arch/x86/kvm/x86.c | 33 +++++++++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig > index fb8efb387aff..f8e6689f490b 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 you write this as: 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..533d3d010a21 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,38 @@ static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp) > return 0; > } > > +#if defined(CONFIG_PM) && defined(CONFIG_HAVE_KVM_PM_NOTIFIER) ... you can simplify this expression to be a simple #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER in both patches. > +static int kvm_arch_suspend_notifier(struct kvm *kvm) > +{ > + struct kvm_vcpu *vcpu; > + int i, ret; > + > + mutex_lock(&kvm->lock); > + kvm_for_each_vcpu(i, vcpu, kvm) { > + ret = kvm_set_guest_paused(vcpu); > + if (ret) { > + pr_err("Failed to pause guest VCPU%d: %d\n", > + vcpu->vcpu_id, ret); Is it really a good idea to fail suspend when a guest doesn't have PV time enabled? I also wonder how useful the pr_err() is, given that it contains no information that would help identifying which guest failed to pause. > + 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_PM && CONFIG_HAVE_KVM_PM_NOTIFIER */ > + > long kvm_arch_vm_ioctl(struct file *filp, > unsigned int ioctl, unsigned long arg) > { > -- > 2.32.0.rc1.229.g3e70b5a671-goog > > Thanks, M. -- Without deviation from the norm, progress is not possible.