KVM: nVMX: Request immediate exit iff pending nested event needs injection
authorSean Christopherson <seanjc@google.com>
Fri, 7 Jun 2024 17:26:05 +0000 (10:26 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 28 Jun 2024 15:59:04 +0000 (08:59 -0700)
commit32f55e475ce2c4b8b124d335fcfaf1152ba977a1
tree1198ebcb805decd54f53d9bc68ddd6d3fc4e8d0d
parentd83c36d822be44db4bad0c43bea99c8908f54117
KVM: nVMX: Request immediate exit iff pending nested event needs injection

When requesting an immediate exit from L2 in order to inject a pending
event, do so only if the pending event actually requires manual injection,
i.e. if and only if KVM actually needs to regain control in order to
deliver the event.

Avoiding the "immediate exit" isn't simply an optimization, it's necessary
to make forward progress, as the "already expired" VMX preemption timer
trick that KVM uses to force a VM-Exit has higher priority than events
that aren't directly injected.

At present time, this is a glorified nop as all events processed by
vmx_has_nested_events() require injection, but that will not hold true in
the future, e.g. if there's a pending virtual interrupt in vmcs02.RVI.
I.e. if KVM is trying to deliver a virtual interrupt to L2, the expired
VMX preemption timer will trigger VM-Exit before the virtual interrupt is
delivered, and KVM will effectively hang the vCPU in an endless loop of
forced immediate VM-Exits (because the pending virtual interrupt never
goes away).

Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20240607172609.3205077-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/x86.c