• Sean Christopherson's avatar
    KVM: nVMX: Sync all PGDs on nested transition with shadow paging · 07ffaf34
    Sean Christopherson authored
    Trigger a full TLB flush on behalf of the guest on nested VM-Enter and
    VM-Exit when VPID is disabled for L2.  kvm_mmu_new_pgd() syncs only the
    current PGD, which can theoretically leave stale, unsync'd entries in a
    previous guest PGD, which could be consumed if L2 is allowed to load CR3
    with PCID_NOFLUSH=1.
    
    Rename KVM_REQ_HV_TLB_FLUSH to KVM_REQ_TLB_FLUSH_GUEST so that it can
    be utilized for its obvious purpose of emulating a guest TLB flush.
    
    Note, there is no change the actual TLB flush executed by KVM, even
    though the fast PGD switch uses KVM_REQ_TLB_FLUSH_CURRENT.  When VPID is
    disabled for L2, vpid02 is guaranteed to be '0', and thus
    nested_get_vpid02() will return the VPID that is shared by L1 and L2.
    
    Generate the request outside of kvm_mmu_new_pgd(), as getting the common
    helper to correctly identify which requested is needed is quite painful.
    E.g. using KVM_REQ_TLB_FLUSH_GUEST when nested EPT is in play is wrong as
    a TLB flush from the L1 kernel's perspective does not invalidate EPT
    mappings.  And, by using KVM_REQ_TLB_FLUSH_GUEST, nVMX can do future
    simplification by moving the logic into nested_vmx_transition_tlb_flush().
    
    Fixes: 41fab65e ("KVM: nVMX: Skip MMU sync on nested VMX transition when possible")
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20210609234235.1244004-2-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    07ffaf34
x86.c 318 KB