• Sean Christopherson's avatar
    Revert "KVM: async_pf: avoid recursive flushing of work items" · 778c350e
    Sean Christopherson authored
    Now that KVM does NOT gift async #PF workers a "struct kvm" reference,
    don't bother skipping "done" workers when flushing/canceling queued
    workers, as the deadlock that was being fudged around can no longer occur.
    When workers, i.e. async_pf_execute(), were gifted a referenced, it was
    possible for a worker to put the last reference and trigger VM destruction,
    i.e. trigger flushing of a workqueue from a worker in said workqueue.
    
    Note, there is no actual lock, the deadlock was that a worker will be
    stuck waiting for itself (the workqueue code simulates a lock/unlock via
    lock_map_{acquire,release}()).
    
    Skipping "done" workers isn't problematic per se, but using work->vcpu as
    a "done" flag is confusing, e.g. it's not clear that async_pf.lock is
    acquired to protect the work->vcpu, NOT the processing of async_pf.queue
    (which is protected by vcpu->mutex).
    
    This reverts commit 22583f0d.
    Suggested-by: default avatarXu Yilun <yilun.xu@linux.intel.com>
    Link: https://lore.kernel.org/r/20240423191649.2885257-1-seanjc@google.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    778c350e
async_pf.c 6.2 KB