• Like Xu's avatar
    KVM: x86/pmu: Avoid using PEBS perf_events for normal counters · cf52de61
    Like Xu authored
    The check logic in the pmc_resume_counter() to determine whether
    a perf_event is reusable is partial and flawed, especially when it
    comes to a pseudocode sequence (contrived, but valid) like:
    
      - enabling a counter and its PEBS bit
      - enable global_ctrl
      - run workload
      - disable only the PEBS bit, leaving the global_ctrl bit enabled
    
    In this corner case, a perf_event created for PEBS can be reused by
    a normal counter before it has been released and recreated, and when this
    normal counter overflows, it triggers a PEBS interrupt (precise_ip != 0).
    
    To address this issue, reprogram all affected counters when PEBS_ENABLE
    change and reuse a counter if and only if PEBS exactly matches precise.
    
    Fixes: 79f3e3b5 ("KVM: x86/pmu: Reprogram PEBS event to emulate guest PEBS counter")
    Signed-off-by: default avatarLike Xu <likexu@tencent.com>
    Link: https://lore.kernel.org/r/20220831085328.45489-4-likexu@tencent.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    cf52de61
pmu_intel.c 22.6 KB