Skip to content

Commit 71dcc11

Browse files
Dapeng MiIngo Molnar
authored andcommitted
perf/x86/intel: Allow to update user space GPRs from PEBS records
Currently when a user samples user space GPRs (--user-regs option) with PEBS, the user space GPRs actually always come from software PMI instead of from PEBS hardware. This leads to the sampled GPRs to possibly be inaccurate for single PEBS record case because of the skid between counter overflow and GPRs sampling on PMI. For the large PEBS case, it is even worse. If user sets the exclude_kernel attribute, large PEBS would be used to sample user space GPRs, but since PEBS GPRs group is not really enabled, it leads to all samples in the large PEBS record to share the same piece of user space GPRs, like this reproducer shows: $ perf record -e branches:pu --user-regs=ip,ax -c 100000 ./foo $ perf report -D | grep "AX" .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead .... AX 0x000000003a0d4ead So enable GPRs group for user space GPRs sampling and prioritize reading GPRs from PEBS. If the PEBS sampled GPRs is not user space GPRs (single PEBS record case), perf_sample_regs_user() modifies them to user space GPRs. [ mingo: Clarified the changelog. ] Fixes: c22497f ("perf/x86/intel: Support adaptive PEBS v4") Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20250415104135.318169-2-dapeng1.mi@linux.intel.com
1 parent a5f5e12 commit 71dcc11

File tree

1 file changed

+5
-3
lines changed
  • arch/x86/events/intel

1 file changed

+5
-3
lines changed

arch/x86/events/intel/ds.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,8 +1399,10 @@ static u64 pebs_update_adaptive_cfg(struct perf_event *event)
13991399
* + precise_ip < 2 for the non event IP
14001400
* + For RTM TSX weight we need GPRs for the abort code.
14011401
*/
1402-
gprs = (sample_type & PERF_SAMPLE_REGS_INTR) &&
1403-
(attr->sample_regs_intr & PEBS_GP_REGS);
1402+
gprs = ((sample_type & PERF_SAMPLE_REGS_INTR) &&
1403+
(attr->sample_regs_intr & PEBS_GP_REGS)) ||
1404+
((sample_type & PERF_SAMPLE_REGS_USER) &&
1405+
(attr->sample_regs_user & PEBS_GP_REGS));
14041406

14051407
tsx_weight = (sample_type & PERF_SAMPLE_WEIGHT_TYPE) &&
14061408
((attr->config & INTEL_ARCH_EVENT_MASK) ==
@@ -2123,7 +2125,7 @@ static void setup_pebs_adaptive_sample_data(struct perf_event *event,
21232125
regs->flags &= ~PERF_EFLAGS_EXACT;
21242126
}
21252127

2126-
if (sample_type & PERF_SAMPLE_REGS_INTR)
2128+
if (sample_type & (PERF_SAMPLE_REGS_INTR | PERF_SAMPLE_REGS_USER))
21272129
adaptive_pebs_save_regs(regs, gprs);
21282130
}
21292131

0 commit comments

Comments
 (0)