• Kan Liang's avatar
    perf/x86/intel/ds: Don't clear ->pebs_data_cfg for the last PEBS event · 312be9fc
    Kan Liang authored
    The MSR_PEBS_DATA_CFG MSR register is used to configure which data groups
    should be generated into a PEBS record, and it's shared among all counters.
    
    If there are different configurations among counters, perf combines all the
    configurations.
    
    The first perf command as below requires a complete PEBS record
    (including memory info, GPRs, XMMs, and LBRs). The second perf command
    only requires a basic group. However, after the second perf command is
    running, the MSR_PEBS_DATA_CFG register is cleared. Only a basic group is
    generated in a PEBS record, which is wrong. The required information
    for the first perf command is missed.
    
     $ perf record --intr-regs=AX,SP,XMM0 -a -C 8 -b -W -d -c 100000003 -o /dev/null -e cpu/event=0xd0,umask=0x81/upp &
     $ sleep 5
     $ perf record  --per-thread  -c 1  -e cycles:pp --no-timestamp --no-tid taskset -c 8 ./noploop 1000
    
    The first PEBS event is a system-wide PEBS event. The second PEBS event
    is a per-thread event. When the thread is scheduled out, the
    intel_pmu_pebs_del() function is invoked to update the PEBS state.
    Since the system-wide event is still available, the cpuc->n_pebs is 1.
    The cpuc->pebs_data_cfg is cleared. The data configuration for the
    system-wide PEBS event is lost.
    
    The (cpuc->n_pebs == 1) check was introduced in commit:
    
      b6a32f02 ("perf/x86: Fix PEBS threshold initialization")
    
    At that time, it indeed didn't hurt whether the state was updated
    during the removal, because only the threshold is updated.
    
    The calculation of the threshold takes the last PEBS event into
    account.
    
    However, since commit:
    
      b752ea0c ("perf/x86/intel/ds: Flush PEBS DS when changing PEBS_DATA_CFG")
    
    we delay the threshold update, and clear the PEBS data config, which triggers
    the bug.
    
    The PEBS data config update scope should not be shrunk during removal.
    
    [ mingo: Improved the changelog & comments. ]
    
    Fixes: b752ea0c ("perf/x86/intel/ds: Flush PEBS DS when changing PEBS_DATA_CFG")
    Reported-by: default avatarStephane Eranian <eranian@google.com>
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20240401133320.703971-1-kan.liang@linux.intel.com
    312be9fc
ds.c 67.9 KB