KVM: x86: Route pending NMIs from userspace through process_nmi()
authorSean Christopherson <seanjc@google.com>
Thu, 23 Mar 2023 00:40:16 +0000 (17:40 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 23 Mar 2023 00:40:16 +0000 (17:40 -0700)
Use the asynchronous NMI queue to handle pending NMIs coming in from
userspace during KVM_SET_VCPU_EVENTS so that all of KVM's logic for
handling multiple NMIs goes through process_nmi().  This will simplify
supporting SVM's upcoming "virtual NMI" functionality, which will need
changes KVM manages pending NMIs.

Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/x86.c

index f18f740f75d8b716cec231b3156c0b589e3a191e..befabb4678f90300255e0374c82202f32339e85a 100644 (file)
@@ -5213,9 +5213,9 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
 
        vcpu->arch.nmi_injected = events->nmi.injected;
        if (events->flags & KVM_VCPUEVENT_VALID_NMI_PENDING) {
-               vcpu->arch.nmi_pending = events->nmi.pending;
-               if (vcpu->arch.nmi_pending)
-                       kvm_make_request(KVM_REQ_NMI, vcpu);
+               vcpu->arch.nmi_pending = 0;
+               atomic_set(&vcpu->arch.nmi_queued, events->nmi.pending);
+               kvm_make_request(KVM_REQ_NMI, vcpu);
        }
        static_call(kvm_x86_set_nmi_mask)(vcpu, events->nmi.masked);