• Jeremi Piotrowski's avatar
    KVM: SVM: Flush Hyper-V TLB when required · e5c972c1
    Jeremi Piotrowski authored
    The Hyper-V "EnlightenedNptTlb" enlightenment is always enabled when KVM
    is running on top of Hyper-V and Hyper-V exposes support for it (which
    is always). On AMD CPUs this enlightenment results in ASID invalidations
    not flushing TLB entries derived from the NPT. To force the underlying
    (L0) hypervisor to rebuild its shadow page tables, an explicit hypercall
    is needed.
    
    The original KVM implementation of Hyper-V's "EnlightenedNptTlb" on SVM
    only added remote TLB flush hooks. This worked out fine for a while, as
    sufficient remote TLB flushes where being issued in KVM to mask the
    problem. Since v5.17, changes in the TDP code reduced the number of
    flushes and the out-of-sync TLB prevents guests from booting
    successfully.
    
    Split svm_flush_tlb_current() into separate callbacks for the 3 cases
    (guest/all/current), and issue the required Hyper-V hypercall when a
    Hyper-V TLB flush is needed. The most important case where the TLB flush
    was missing is when loading a new PGD, which is followed by what is now
    svm_flush_tlb_current().
    
    Cc: stable@vger.kernel.org # v5.17+
    Fixes: 1e0c7d40 ("KVM: SVM: hyper-v: Remote TLB flush for SVM")
    Link: https://lore.kernel.org/lkml/43980946-7bbf-dcef-7e40-af904c456250@linux.microsoft.com/Suggested-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarJeremi Piotrowski <jpiotrowski@linux.microsoft.com>
    Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Message-Id: <20230324145233.4585-1-jpiotrowski@linux.microsoft.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    e5c972c1
svm_onhyperv.h 2.96 KB