KVM: nVMX: promptly process interrupts delivered while in guest mode
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 20 Oct 2021 10:22:59 +0000 (06:22 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 21 Oct 2021 07:35:42 +0000 (03:35 -0400)
Since commit c300ab9f08df ("KVM: x86: Replace late check_nested_events() hack with
more precise fix") there is no longer the certainty that check_nested_events()
tries to inject an external interrupt vmexit to L1 on every call to vcpu_enter_guest.
Therefore, even in that case we need to set KVM_REQ_EVENT.  This ensures
that inject_pending_event() is called, and from there kvm_check_nested_events().

Fixes: c300ab9f08df ("KVM: x86: Replace late check_nested_events() hack with more precise fix")
Cc: stable@vger.kernel.org
Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/vmx.c

index 7fb2a3a..7d595ef 100644 (file)
@@ -6305,18 +6305,13 @@ static int vmx_sync_pir_to_irr(struct kvm_vcpu *vcpu)
 
                /*
                 * If we are running L2 and L1 has a new pending interrupt
-                * which can be injected, we should re-evaluate
-                * what should be done with this new L1 interrupt.
-                * If L1 intercepts external-interrupts, we should
-                * exit from L2 to L1. Otherwise, interrupt should be
-                * delivered directly to L2.
+                * which can be injected, this may cause a vmexit or it may
+                * be injected into L2.  Either way, this interrupt will be
+                * processed via KVM_REQ_EVENT, not RVI, because we do not use
+                * virtual interrupt delivery to inject L1 interrupts into L2.
                 */
-               if (is_guest_mode(vcpu) && max_irr_updated) {
-                       if (nested_exit_on_intr(vcpu))
-                               kvm_vcpu_exiting_guest_mode(vcpu);
-                       else
-                               kvm_make_request(KVM_REQ_EVENT, vcpu);
-               }
+               if (is_guest_mode(vcpu) && max_irr_updated)
+                       kvm_make_request(KVM_REQ_EVENT, vcpu);
        } else {
                max_irr = kvm_lapic_find_highest_irr(vcpu);
        }