On Fri, Feb 25, 2022 at 4:16 PM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > Look for a !leaf=>leaf conversion instead of a PFN change when checking > if a SPTE change removed a TDP MMU shadow page. Convert the PFN check > into a WARN, as KVM should never change the PFN of a shadow page (except > when its being zapped or replaced). > > From a purely theoretical perspective, it's not illegal to replace a SP > with a hugepage pointing at the same PFN. In practice, it's impossible > as that would require mapping guest memory overtop a kernel-allocated SP. > Either way, the check is odd. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Reviewed-by: Ben Gardon <bgardon@xxxxxxxxxx> > --- > arch/x86/kvm/mmu/tdp_mmu.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c > index 189f21e71c36..848448b65703 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.c > +++ b/arch/x86/kvm/mmu/tdp_mmu.c > @@ -505,9 +505,12 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn, > > /* > * Recursively handle child PTs if the change removed a subtree from > - * the paging structure. > + * the paging structure. Note the WARN on the PFN changing without the > + * SPTE being converted to a hugepage (leaf) or being zapped. Shadow > + * pages are kernel allocations and should never be migrated. > */ > - if (was_present && !was_leaf && (pfn_changed || !is_present)) > + if (was_present && !was_leaf && > + (is_leaf || !is_present || WARN_ON_ONCE(pfn_changed))) > handle_removed_pt(kvm, spte_to_child_pt(old_spte, level), shared); > } > > -- > 2.35.1.574.g5d30c73bfb-goog >