lkml.org 
[lkml]   [2018]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 20/31] kvm: x86: vmx: fix vpid leak
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Roman Kagan <rkagan@virtuozzo.com>

    commit 63aff65573d73eb8dda4732ad4ef222dd35e4862 upstream.

    VPID for the nested vcpu is allocated at vmx_create_vcpu whenever nested
    vmx is turned on with the module parameter.

    However, it's only freed if the L1 guest has executed VMXON which is not
    a given.

    As a result, on a system with nested==on every creation+deletion of an
    L1 vcpu without running an L2 guest results in leaking one vpid. Since
    the total number of vpids is limited to 64k, they can eventually get
    exhausted, preventing L2 from starting.

    Delay allocation of the L2 vpid until VMXON emulation, thus matching its
    freeing.

    Fixes: 5c614b3583e7b6dab0c86356fa36c2bcbb8322a0
    Cc: stable@vger.kernel.org
    Signed-off-by: Roman Kagan <rkagan@virtuozzo.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/kvm/vmx.c | 7 +++----
    1 file changed, 3 insertions(+), 4 deletions(-)

    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -7660,6 +7660,8 @@ static int enter_vmx_operation(struct kv
    HRTIMER_MODE_REL_PINNED);
    vmx->nested.preemption_timer.function = vmx_preemption_timer_fn;

    + vmx->nested.vpid02 = allocate_vpid();
    +
    vmx->nested.vmxon = true;
    return 0;

    @@ -10108,11 +10110,9 @@ static struct kvm_vcpu *vmx_create_vcpu(
    goto free_vmcs;
    }

    - if (nested) {
    + if (nested)
    nested_vmx_setup_ctls_msrs(&vmx->nested.msrs,
    kvm_vcpu_apicv_active(&vmx->vcpu));
    - vmx->nested.vpid02 = allocate_vpid();
    - }

    vmx->nested.posted_intr_nv = -1;
    vmx->nested.current_vmptr = -1ull;
    @@ -10129,7 +10129,6 @@ static struct kvm_vcpu *vmx_create_vcpu(
    return &vmx->vcpu;

    free_vmcs:
    - free_vpid(vmx->nested.vpid02);
    free_loaded_vmcs(vmx->loaded_vmcs);
    free_msrs:
    kfree(vmx->guest_msrs);

    \
     
     \ /
      Last update: 2018-08-04 11:23    [W:4.379 / U:0.956 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site