• S
    KVM: x86/mmu: Don't allow TDP MMU to yield when recovering NX pages · a2c9d658
    Sean Christopherson 提交于
    stable inclusion
    from stable-5.10.30
    commit 25fc773b21cef7b9c43ad9e58e374678222954f3
    bugzilla: 51791
    
    --------------------------------
    
    [ Upstream commit 33a31641 ]
    
    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: NSean Christopherson <seanjc@google.com>
    Message-Id: <20210325200119.1359384-4-seanjc@google.com>
    [Add lockdep assertion. - Paolo]
    Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Acked-by: N  Weilong Chen <chenweilong@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    a2c9d658
mmu.c 158.0 KB