On Thu, Apr 1, 2021 at 3:36 AM Paolo Bonzini <pbonz...@redhat.com> wrote: > > On 31/03/21 23:08, Ben Gardon wrote: > > > > + if (is_tdp_mmu_enabled(kvm)) > > + kvm_tdp_mmu_invalidate_roots(kvm); > > + > > /* > > * Toggle mmu_valid_gen between '0' and '1'. Because slots_lock is > > * held for the entire duration of zapping obsolete pages, it's > > @@ -5451,9 +5454,6 @@ static void kvm_mmu_zap_all_fast(struct kvm *kvm) > > > > kvm_zap_obsolete_pages(kvm); > > > > - if (is_tdp_mmu_enabled(kvm)) > > - kvm_tdp_mmu_zap_all(kvm); > > - > > This is just cosmetic, but I'd prefer to keep the call to > kvm_tdp_mmu_invalidate_roots at the original place, so that it's clear > in the next patch that it's two separate parts because of the different > locking requirements.
I'm not sure exactly what you mean and I could certainly do a better job explaining in the commit description, but it's actually quite important that kvm_tdp_mmu_invalidate_roots at least precede kvm_zap_obsolete_pages as kvm_zap_obsolete_pages drops the lock and yields. If kvm_tdp_mmu_invalidate_roots doesn't go first then vCPUs could wind up dropping their ref on an old root and then picking it up again before the last root had a chance to drop its ref. Explaining in the description that kvm_tdp_mmu_zap_all is being dropped because it is no longer necessary (as opposed to being moved) might help make that cleaner. Alternatively I could just leave kvm_tdp_mmu_zap_all and replace it in the next patch. > > Paolo >