[Impish][SRU][PATCH 1/3] KVM: Add infrastructure and macro to mark VM as bugged

Po-Hsu Lin po-hsu.lin at canonical.com
Wed Apr 13 14:49:10 UTC 2022


On Wed, Apr 13, 2022 at 6:37 PM Kleber Souza <kleber.souza at canonical.com> wrote:
>
> On 11.04.22 16:01, Po-Hsu Lin wrote:
> > From: Sean Christopherson <sean.j.christopherson at intel.com>
> >
> > BugLink: https://bugs.launchpad.net/bugs/1966499
> >
> > Signed-off-by: Sean Christopherson <sean.j.christopherson at intel.com>
> > Signed-off-by: Isaku Yamahata <isaku.yamahata at intel.com>
> > Reviewed-by: Paolo Bonzini <pbonzini at redhat.com>
> > Message-Id: <3a0998645c328bf0895f1290e61821b70f048549.1625186503.git.isaku.yamahata at intel.com>
> > Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
> > (backported from commit 0b8f11737cffc1a406d1134b58687abc29d76b52)
> > [PHLin: missing 2fdef3a2ae CONFIG_HAVE_KVM_PM_NOTIFIER check]
> > [PHLin: missing fcfe1baedd char stats_id]
>
> Hi Sam,
>
> To help with the backport review, it would be useful to have some
> additional information on what changes were required because of the
> missing commits. E.g. whether only context adjustments or other
> changes were needed.
>
> Thanks,
>
> Kleber
>
Hi Kleber,
thanks for the feedback, will try to be more specific for future patches.
Cheers
Sam

> > Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
> > ---
> >   include/linux/kvm_host.h | 28 +++++++++++++++++++++++++++-
> >   virt/kvm/kvm_main.c      | 10 +++++-----
> >   2 files changed, 32 insertions(+), 6 deletions(-)
> >
> > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> > index 8583ed3f..41b652f 100644
> > --- a/include/linux/kvm_host.h
> > +++ b/include/linux/kvm_host.h
> > @@ -149,6 +149,7 @@ static inline bool is_error_page(struct page *page)
> >   #define KVM_REQ_MMU_RELOAD        (1 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
> >   #define KVM_REQ_UNBLOCK           2
> >   #define KVM_REQ_UNHALT            3
> > +#define KVM_REQ_VM_BUGGED         (4 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
> >   #define KVM_REQUEST_ARCH_BASE     8
> >
> >   #define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \
> > @@ -585,6 +586,7 @@ struct kvm {
> >       pid_t userspace_pid;
> >       unsigned int max_halt_poll_ns;
> >       u32 dirty_ring_size;
> > +     bool vm_bugged;
> >   };
> >
> >   #define kvm_err(fmt, ...) \
> > @@ -613,6 +615,31 @@ struct kvm {
> >   #define vcpu_err(vcpu, fmt, ...)                                    \
> >       kvm_err("vcpu%i " fmt, (vcpu)->vcpu_id, ## __VA_ARGS__)
> >
> > +bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
> > +static inline void kvm_vm_bugged(struct kvm *kvm)
> > +{
> > +     kvm->vm_bugged = true;
> > +     kvm_make_all_cpus_request(kvm, KVM_REQ_VM_BUGGED);
> > +}
> > +
> > +#define KVM_BUG(cond, kvm, fmt...)                           \
> > +({                                                           \
> > +     int __ret = (cond);                                     \
> > +                                                             \
> > +     if (WARN_ONCE(__ret && !(kvm)->vm_bugged, fmt))         \
> > +             kvm_vm_bugged(kvm);                             \
> > +     unlikely(__ret);                                        \
> > +})
> > +
> > +#define KVM_BUG_ON(cond, kvm)                                        \
> > +({                                                           \
> > +     int __ret = (cond);                                     \
> > +                                                             \
> > +     if (WARN_ON_ONCE(__ret && !(kvm)->vm_bugged))           \
> > +             kvm_vm_bugged(kvm);                             \
> > +     unlikely(__ret);                                        \
> > +})
> > +
> >   static inline bool kvm_dirty_log_manual_protect_and_init_set(struct kvm *kvm)
> >   {
> >       return !!(kvm->manual_dirty_log_protect & KVM_DIRTY_LOG_INITIALLY_SET);
> > @@ -930,7 +957,6 @@ void *kvm_mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc);
> >   bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
> >                                struct kvm_vcpu *except,
> >                                unsigned long *vcpu_bitmap, cpumask_var_t tmp);
> > -bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
> >   bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
> >                                     struct kvm_vcpu *except);
> >   bool kvm_make_cpus_request_mask(struct kvm *kvm, unsigned int req,
> > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> > index 93b5f76..309db8d 100644
> > --- a/virt/kvm/kvm_main.c
> > +++ b/virt/kvm/kvm_main.c
> > @@ -3455,7 +3455,7 @@ static long kvm_vcpu_ioctl(struct file *filp,
> >       struct kvm_fpu *fpu = NULL;
> >       struct kvm_sregs *kvm_sregs = NULL;
> >
> > -     if (vcpu->kvm->mm != current->mm)
> > +     if (vcpu->kvm->mm != current->mm || vcpu->kvm->vm_bugged)
> >               return -EIO;
> >
> >       if (unlikely(_IOC_TYPE(ioctl) != KVMIO))
> > @@ -3661,7 +3661,7 @@ static long kvm_vcpu_compat_ioctl(struct file *filp,
> >       void __user *argp = compat_ptr(arg);
> >       int r;
> >
> > -     if (vcpu->kvm->mm != current->mm)
> > +     if (vcpu->kvm->mm != current->mm || vcpu->kvm->vm_bugged)
> >               return -EIO;
> >
> >       switch (ioctl) {
> > @@ -3727,7 +3727,7 @@ static long kvm_device_ioctl(struct file *filp, unsigned int ioctl,
> >   {
> >       struct kvm_device *dev = filp->private_data;
> >
> > -     if (dev->kvm->mm != current->mm)
> > +     if (dev->kvm->mm != current->mm || dev->kvm->vm_bugged)
> >               return -EIO;
> >
> >       switch (ioctl) {
> > @@ -4011,7 +4011,7 @@ static long kvm_vm_ioctl(struct file *filp,
> >       void __user *argp = (void __user *)arg;
> >       int r;
> >
> > -     if (kvm->mm != current->mm)
> > +     if (kvm->mm != current->mm || kvm->vm_bugged)
> >               return -EIO;
> >       switch (ioctl) {
> >       case KVM_CREATE_VCPU:
> > @@ -4219,7 +4219,7 @@ static long kvm_vm_compat_ioctl(struct file *filp,
> >       struct kvm *kvm = filp->private_data;
> >       int r;
> >
> > -     if (kvm->mm != current->mm)
> > +     if (kvm->mm != current->mm || kvm->vm_bugged)
> >               return -EIO;
> >       switch (ioctl) {
> >   #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT
>



More information about the kernel-team mailing list