Re: [PATCH 12/13] KVM: x86/mmu: Fast invalidation for TDP MMU

From: Ben Gardon
Date: Thu Apr 01 2021 - 14:33:18 EST


On Thu, Apr 1, 2021 at 3:36 AM Paolo Bonzini <pbonzini@xxxxxxxxxx> 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
>