• Jim Mattson's avatar
    KVM: x86/pmu: Synthesize at most one PMI per VM-exit · 73554b29
    Jim Mattson authored
    When the irq_work callback, kvm_pmi_trigger_fn(), is invoked during a
    VM-exit that also invokes __kvm_perf_overflow() as a result of
    instruction emulation, kvm_pmu_deliver_pmi() will be called twice
    before the next VM-entry.
    
    Calling kvm_pmu_deliver_pmi() twice is unlikely to be problematic now that
    KVM sets the LVTPC mask bit when delivering a PMI.  But using IRQ work to
    trigger the PMI is still broken, albeit very theoretically.
    
    E.g. if the self-IPI to trigger IRQ work is be delayed long enough for the
    vCPU to be migrated to a different pCPU, then it's possible for
    kvm_pmi_trigger_fn() to race with the kvm_pmu_deliver_pmi() from
    KVM_REQ_PMI and still generate two PMIs.
    
    KVM could set the mask bit using an atomic operation, but that'd just be
    piling on unnecessary code to workaround what is effectively a hack.  The
    *only* reason KVM uses IRQ work is to ensure the PMI is treated as a wake
    event, e.g. if the vCPU just executed HLT.
    
    Remove the irq_work callback for synthesizing a PMI, and all of the
    logic for invoking it. Instead, to prevent a vcpu from leaving C0 with
    a PMI pending, add a check for KVM_REQ_PMI to kvm_vcpu_has_events().
    
    Fixes: 9cd803d4 ("KVM: x86: Update vPMCs when retiring instructions")
    Signed-off-by: default avatarJim Mattson <jmattson@google.com>
    Tested-by: default avatarMingwei Zhang <mizhang@google.com>
    Tested-by: default avatarDapeng Mi <dapeng1.mi@linux.intel.com>
    Signed-off-by: default avatarMingwei Zhang <mizhang@google.com>
    Link: https://lore.kernel.org/r/20230925173448.3518223-2-mizhang@google.com
    [sean: massage changelog]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    73554b29
kvm_host.h 68.1 KB