lkml.org 
[lkml]   [2020]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 20/22] KVM: VMX: Use vmx_interrupt_blocked() directly from vmx_handle_exit()
    Date
    From: Sean Christopherson <sean.j.christopherson@intel.com>

    Use vmx_interrupt_blocked() instead of bouncing through
    vmx_interrupt_allowed() when handling edge cases in vmx_handle_exit().
    The nested_run_pending check in vmx_interrupt_allowed() should never
    evaluate true in the VM-Exit path.

    Hoist the WARN in handle_invalid_guest_state() up to vmx_handle_exit()
    to enforce the above assumption for the !enable_vnmi case, and to detect
    any other potential bugs with nested VM-Enter.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    Message-Id: <20200423022550.15113-12-sean.j.christopherson@intel.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    ---
    arch/x86/kvm/vmx/vmx.c | 19 ++++++++++---------
    1 file changed, 10 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index 7fb7dcb3d94d..0e5eacd6f911 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -5268,18 +5268,11 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
    bool intr_window_requested;
    unsigned count = 130;

    - /*
    - * We should never reach the point where we are emulating L2
    - * due to invalid guest state as that means we incorrectly
    - * allowed a nested VMEntry with an invalid vmcs12.
    - */
    - WARN_ON_ONCE(vmx->emulation_required && vmx->nested.nested_run_pending);
    -
    intr_window_requested = exec_controls_get(vmx) &
    CPU_BASED_INTR_WINDOW_EXITING;

    while (vmx->emulation_required && count-- != 0) {
    - if (intr_window_requested && vmx_interrupt_allowed(vcpu))
    + if (intr_window_requested && !vmx_interrupt_blocked(vcpu))
    return handle_interrupt_window(&vmx->vcpu);

    if (kvm_test_request(KVM_REQ_EVENT, vcpu))
    @@ -5896,6 +5889,14 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu,
    if (enable_pml)
    vmx_flush_pml_buffer(vcpu);

    + /*
    + * We should never reach this point with a pending nested VM-Enter, and
    + * more specifically emulation of L2 due to invalid guest state (see
    + * below) should never happen as that means we incorrectly allowed a
    + * nested VM-Enter with an invalid vmcs12.
    + */
    + WARN_ON_ONCE(vmx->nested.nested_run_pending);
    +
    /* If guest state is invalid, start emulating */
    if (vmx->emulation_required)
    return handle_invalid_guest_state(vcpu);
    @@ -5962,7 +5963,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu,

    if (unlikely(!enable_vnmi &&
    vmx->loaded_vmcs->soft_vnmi_blocked)) {
    - if (vmx_interrupt_allowed(vcpu)) {
    + if (!vmx_interrupt_blocked(vcpu)) {
    vmx->loaded_vmcs->soft_vnmi_blocked = 0;
    } else if (vmx->loaded_vmcs->vnmi_blocked_time > 1000000000LL &&
    vcpu->arch.nmi_pending) {
    --
    2.18.2

    \
     
     \ /
      Last update: 2020-04-25 09:03    [W:4.035 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site