On Wed, Mar 02, 2022, Paolo Bonzini wrote: > On 3/2/22 19:01, Sean Christopherson wrote: > > > It passes a smoke test, and also resolves the debate on the fate of patch 1. > > +1000, I love this approach. Do you want me to work on a v3, or shall I let you > > have the honors? > > I'm already running the usual battery of tests, so I should be able to post > it either tomorrow (early in my evening) or Friday morning. Gah, now I remember why I didn't use an async worker. kvm_mmu_zap_all_fast() must ensure all SPTEs are zapped and their dirty/accessed data written back to the primary MMU prior to returning. Once the memslot update completes, the old deleted/moved memslot is no longer reachable by the mmu_notifier. If an mmu_notifier zaps pfns reachable via the root, KVM will do nothing because there's no relevant memslot. So we can use workers, but kvm_mmu_zap_all_fast() would need to flush all workers before returning, which ends up being no different than putting the invalid roots on a different list. What about that idea? Put roots invalidated by "fast zap" on _another_ list? My very original idea of moving the roots to a separate list didn't work because the roots needed to be reachable by the mmu_notifier. But we could just add another list_head (inside the unsync_child_bitmap union) and add the roots to _that_ list. Let me go resurrect that patch from v1 and tweak it to keep the roots on the old list, but add them to a new list as well. That would get rid of the invalid root iterator stuff.