On Tue, Jun 22, 2021 at 12:24 AM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > Treat a NULL shadow page in the "is a TDP MMU" check as valid, non-TDP > root. KVM uses a "direct" PAE paging MMU when TDP is disabled and the > guest is running with paging disabled. In that case, root_hpa points at > the pae_root page (of which only 32 bytes are used), not a standard > shadow page, and the WARN fires (a lot). > > Fixes: 0b873fd7fb53 ("KVM: x86/mmu: Remove redundant is_tdp_mmu_enabled check") > Cc: David Matlack <dmatlack@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Thanks for the fix. I was able to reproduce the issue by running a kvm-unit-test with EPT=N. I'll add that to my "pre-send-email" workflow in the future. Reviewed-by: David Matlack <dmatlack@xxxxxxxxxx> > --- > arch/x86/kvm/mmu/tdp_mmu.h | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.h b/arch/x86/kvm/mmu/tdp_mmu.h > index b981a044ab55..1cae4485b3bc 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.h > +++ b/arch/x86/kvm/mmu/tdp_mmu.h > @@ -94,11 +94,13 @@ static inline bool is_tdp_mmu(struct kvm_mmu *mmu) > if (WARN_ON(!VALID_PAGE(hpa))) > return false; > > + /* > + * A NULL shadow page is legal when shadowing a non-paging guest with > + * PAE paging, as the MMU will be direct with root_hpa pointing at the > + * pae_root page, not a shadow page. > + */ > sp = to_shadow_page(hpa); > - if (WARN_ON(!sp)) > - return false; > - > - return is_tdp_mmu_page(sp) && sp->root_count; > + return sp && is_tdp_mmu_page(sp) && sp->root_count; > } > #else > static inline bool kvm_mmu_init_tdp_mmu(struct kvm *kvm) { return false; } > -- > 2.32.0.288.g62a8d224e6-goog >