• Lai Jiangshan's avatar
    KVM: x86: Unload MMU on guest TLB flush if TDP disabled to force MMU sync · b53e84ee
    Lai Jiangshan authored
    When using shadow paging, unload the guest MMU when emulating a guest TLB
    flush to ensure all roots are synchronized.  From the guest's perspective,
    flushing the TLB ensures any and all modifications to its PTEs will be
    recognized by the CPU.
    
    Note, unloading the MMU is overkill, but is done to mirror KVM's existing
    handling of INVPCID(all) and ensure the bug is squashed.  Future cleanup
    can be done to more precisely synchronize roots when servicing a guest
    TLB flush.
    
    If TDP is enabled, synchronizing the MMU is unnecessary even if nested
    TDP is in play, as a "legacy" TLB flush from L1 does not invalidate L1's
    TDP mappings.  For EPT, an explicit INVEPT is required to invalidate
    guest-physical mappings; for NPT, guest mappings are always tagged with
    an ASID and thus can only be invalidated via the VMCB's ASID control.
    
    This bug has existed since the introduction of KVM_VCPU_FLUSH_TLB.
    It was only recently exposed after Linux guests stopped flushing the
    local CPU's TLB prior to flushing remote TLBs (see commit 4ce94eab,
    "x86/mm/tlb: Flush remote and local TLBs concurrently"), but is also
    visible in Windows 10 guests.
    Tested-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Fixes: f38a7b75 ("KVM: X86: support paravirtualized help for TLB shootdowns")
    Signed-off-by: default avatarLai Jiangshan <laijs@linux.alibaba.com>
    [sean: massaged comment and changelog]
    Message-Id: <20210531172256.2908-1-jiangshanlai@gmail.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    b53e84ee
x86.c 312 KB