Message ID | 20200423022550.15113-4-sean.j.christopherson@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Event fixes and cleanup | expand |
On Wed, Apr 22, 2020 at 7:26 PM Sean Christopherson <sean.j.christopherson@intel.com> wrote: > > Re-request KVM_REQ_EVENT if vcpu_enter_guest() bails after processing > pending requests and an immediate exit was requested. This fixes a bug > where a pending event, e.g. VMX preemption timer, is delayed and/or lost > if the exit was deferred due to something other than a higher priority > _injected_ event, e.g. due to a pending nested VM-Enter. This bug only > affects the !injected case as kvm_x86_ops.cancel_injection() sets > KVM_REQ_EVENT to redo the injection, but that's purely serendipitous > behavior with respect to the deferred event. > > Note, emulated preemption timer isn't the only event that can be > affected, it simply happens to be the only event where not re-requesting > KVM_REQ_EVENT is blatantly visible to the guest. > > Fixes: f4124500c2c13 ("KVM: nVMX: Fully emulate preemption timer") > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Reviewed-by: Jim Mattson <jmattson@google.com>
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ecd612807546..6af873b7e0ae 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8489,6 +8489,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) return r; cancel_injection: + if (req_immediate_exit) + kvm_make_request(KVM_REQ_EVENT, vcpu); kvm_x86_ops.cancel_injection(vcpu); if (unlikely(vcpu->arch.apic_attention)) kvm_lapic_sync_from_vapic(vcpu);
Re-request KVM_REQ_EVENT if vcpu_enter_guest() bails after processing pending requests and an immediate exit was requested. This fixes a bug where a pending event, e.g. VMX preemption timer, is delayed and/or lost if the exit was deferred due to something other than a higher priority _injected_ event, e.g. due to a pending nested VM-Enter. This bug only affects the !injected case as kvm_x86_ops.cancel_injection() sets KVM_REQ_EVENT to redo the injection, but that's purely serendipitous behavior with respect to the deferred event. Note, emulated preemption timer isn't the only event that can be affected, it simply happens to be the only event where not re-requesting KVM_REQ_EVENT is blatantly visible to the guest. Fixes: f4124500c2c13 ("KVM: nVMX: Fully emulate preemption timer") Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> --- arch/x86/kvm/x86.c | 2 ++ 1 file changed, 2 insertions(+)