Message ID | 20210202185734.1680553-11-bgardon@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Allow parallel MMU operations with TDP MMU | expand |
On 02/02/21 19:57, Ben Gardon wrote: > There is a bug in the TDP MMU function to zap SPTEs which could be > replaced with a larger mapping which prevents the function from doing > anything. Fix this by correctly zapping the last level SPTEs. > > Fixes: 14881998566d ("kvm: x86/mmu: Support disabling dirty logging for the tdp MMU") > Signed-off-by: Ben Gardon <bgardon@google.com> > --- > arch/x86/kvm/mmu/tdp_mmu.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c > index c3075fb568eb..e3066d08c1dc 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.c > +++ b/arch/x86/kvm/mmu/tdp_mmu.c > @@ -1098,8 +1098,8 @@ bool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot) > } > > /* > - * Clear non-leaf entries (and free associated page tables) which could > - * be replaced by large mappings, for GFNs within the slot. > + * Clear leaf entries which could be replaced by large mappings, for > + * GFNs within the slot. > */ > static void zap_collapsible_spte_range(struct kvm *kvm, > struct kvm_mmu_page *root, > @@ -1111,7 +1111,7 @@ static void zap_collapsible_spte_range(struct kvm *kvm, > > tdp_root_for_each_pte(iter, root, start, end) { > if (!is_shadow_present_pte(iter.old_spte) || > - is_last_spte(iter.old_spte, iter.level)) > + !is_last_spte(iter.old_spte, iter.level)) > continue; > > pfn = spte_to_pfn(iter.old_spte); > Queued for 5.11-rc, thanks. Paolo
diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index c3075fb568eb..e3066d08c1dc 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1098,8 +1098,8 @@ bool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot) } /* - * Clear non-leaf entries (and free associated page tables) which could - * be replaced by large mappings, for GFNs within the slot. + * Clear leaf entries which could be replaced by large mappings, for + * GFNs within the slot. */ static void zap_collapsible_spte_range(struct kvm *kvm, struct kvm_mmu_page *root, @@ -1111,7 +1111,7 @@ static void zap_collapsible_spte_range(struct kvm *kvm, tdp_root_for_each_pte(iter, root, start, end) { if (!is_shadow_present_pte(iter.old_spte) || - is_last_spte(iter.old_spte, iter.level)) + !is_last_spte(iter.old_spte, iter.level)) continue; pfn = spte_to_pfn(iter.old_spte);
There is a bug in the TDP MMU function to zap SPTEs which could be replaced with a larger mapping which prevents the function from doing anything. Fix this by correctly zapping the last level SPTEs. Fixes: 14881998566d ("kvm: x86/mmu: Support disabling dirty logging for the tdp MMU") Signed-off-by: Ben Gardon <bgardon@google.com> --- arch/x86/kvm/mmu/tdp_mmu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)