• Paolo Bonzini's avatar
    KVM: x86/mmu: Zap defunct roots via asynchronous worker · efd995da
    Paolo Bonzini authored
    Zap defunct roots, a.k.a. roots that have been invalidated after their
    last reference was initially dropped, asynchronously via the existing work
    queue instead of forcing the work upon the unfortunate task that happened
    to drop the last reference.
    
    If a vCPU task drops the last reference, the vCPU is effectively blocked
    by the host for the entire duration of the zap.  If the root being zapped
    happens be fully populated with 4kb leaf SPTEs, e.g. due to dirty logging
    being active, the zap can take several hundred seconds.  Unsurprisingly,
    most guests are unhappy if a vCPU disappears for hundreds of seconds.
    
    E.g. running a synthetic selftest that triggers a vCPU root zap with
    ~64tb of guest memory and 4kb SPTEs blocks the vCPU for 900+ seconds.
    Offloading the zap to a worker drops the block time to <100ms.
    
    There is an important nuance to this change.  If the same work item
    was queued twice before the work function has run, it would only
    execute once and one reference would be leaked.  Therefore, now that
    queueing and flushing items is not anymore protected by kvm->slots_lock,
    kvm_tdp_mmu_invalidate_all_roots() has to check root->role.invalid and
    skip already invalid roots.  On the other hand, kvm_mmu_zap_all_fast()
    must return only after those skipped roots have been zapped as well.
    These two requirements can be satisfied only if _all_ places that
    change invalid to true now schedule the worker before releasing the
    mmu_lock.  There are just two, kvm_tdp_mmu_put_root() and
    kvm_tdp_mmu_invalidate_all_roots().
    Co-developed-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Reviewed-by: default avatarBen Gardon <bgardon@google.com>
    Message-Id: <20220226001546.360188-23-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    efd995da
tdp_mmu.c 55.4 KB