• Sean Christopherson's avatar
    KVM: x86/mmu: Don't allow TDP MMU to yield when recovering NX pages · 33a31641
    Sean Christopherson authored
    Prevent the TDP MMU from yielding when zapping a gfn range during NX
    page recovery.  If a flush is pending from a previous invocation of the
    zapping helper, either in the TDP MMU or the legacy MMU, but the TDP MMU
    has not accumulated a flush for the current invocation, then yielding
    will release mmu_lock with stale TLB entries.
    
    That being said, this isn't technically a bug fix in the current code, as
    the TDP MMU will never yield in this case.  tdp_mmu_iter_cond_resched()
    will yield if and only if it has made forward progress, as defined by the
    current gfn vs. the last yielded (or starting) gfn.  Because zapping a
    single shadow page is guaranteed to (a) find that page and (b) step
    sideways at the level of the shadow page, the TDP iter will break its loop
    before getting a chance to yield.
    
    But that is all very, very subtle, and will break at the slightest sneeze,
    e.g. zapping while holding mmu_lock for read would break as the TDP MMU
    wouldn't be guaranteed to see the present shadow page, and thus could step
    sideways at a lower level.
    
    Cc: Ben Gardon <bgardon@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20210325200119.1359384-4-seanjc@google.com>
    [Add lockdep assertion. - Paolo]
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    33a31641
tdp_mmu.c 39.2 KB