Commit 131717e6 authored by Shivani Nittor's avatar Shivani Nittor Committed by Madhavan Srinivasan
Browse files

powerpc/perf: Update check for PERF_SAMPLE_DATA_SRC marked events



The core-book3s PMU sampling code validates the SIER TYPE field
when PERF_SAMPLE_DATA_SRC is requested. The SIER TYPE field
indicates the instruction type and is only valid for
random sampling (marked events). To handle cases observed where
SIER TYPE could be zero even for marked events,validation was
added to drop such samples and increment event->lost_samples.

However, this validation was applied to all samples,
including continuous sampling. In continuous sampling mode,
the PMU does not set the SIER TYPE field, so it remains zero.
As a result, valid continuous samples were incorrectly
treated as invalid and dropped. Fixed this by gating the
SIER TYPE validation with mark_event, so the check runs only
for marked (random) events. Continuous samples now skip this
check and are recorded normally in the final data recording path.

Fixes: 2ffb26af ("arch/powerpc/perf: Check the instruction type before creating sample with perf_mem_data_src")
Signed-off-by: default avatarShivani Nittor <shivani@linux.ibm.com>
Reviewed-by: default avatarMukesh Kumar Chaurasiya (IBM) <mkchauras@gmail.com>
Reviewed-by: default avatarAthira Rajeev <atrajeev@linux.ibm.com>
[Maddy: Fixed reviewed-by tag]
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260421150628.96500-1-shivani@linux.ibm.com
parent da107152
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2242,6 +2242,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
	const u64 last_period = event->hw.last_period;
	s64 prev, delta, left;
	int record = 0;
	int mark_event = regs->dsisr & MMCRA_SAMPLE_ENABLE;

	if (event->hw.state & PERF_HES_STOPPED) {
		write_pmc(event->hw.idx, 0);
@@ -2304,9 +2305,9 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
	 * In ISA v3.0 and before values "0" and "7" are considered reserved.
	 * In ISA v3.1, value "7" has been used to indicate "larx/stcx".
	 * Drop the sample if "type" has reserved values for this field with a
	 * ISA version check.
	 * ISA version check for marked events.
	 */
	if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC &&
	if (mark_event && event->attr.sample_type & PERF_SAMPLE_DATA_SRC &&
			ppmu->get_mem_data_src) {
		val = (regs->dar & SIER_TYPE_MASK) >> SIER_TYPE_SHIFT;
		if (val == 0 || (val == 7 && !cpu_has_feature(CPU_FTR_ARCH_31))) {