From: Matt Turner <mattst88@gmail.com>
To: Richard Henderson <richard.henderson@linaro.org>,
Magnus Lindholm <linmag7@gmail.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
Michael Cree <mcree@orcon.net.nz>
Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org,
Matt Turner <mattst88@gmail.com>
Subject: [PATCH v7 08/14] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data
Date: Thu, 05 Nov 2026 23:30:27 -0500 [thread overview]
Message-ID: <20261105-alpha-profileme-v7-8-c474e892abb0@gmail.com> (raw)
In-Reply-To: <20261105-alpha-profileme-v7-0-c474e892abb0@gmail.com>
A ProfileMe sample's PC alone does not say what happened to the profiled
instruction. I_STAT and PCTR_CTL do: whether it trapped and why, was
mispredicted, stalled, or was killed on a wrong path, and what PCTR1
counted during the window.
With PERF_SAMPLE_RAW, attach PMPC, I_STAT and PCTR_CTL to each ProfileMe
sample in a versioned struct alpha_profileme_sample. PMPC is included
because a PALmode PMPC is not the sample's IP. Killed instructions can be
told apart by PM_KILLED_BM and VAL. The 64-bit fields are packed after
the 32-bit version, since the payload follows the 32-bit raw size in the
sample record: they are then 8-byte aligned in the record, which needs
no padding.
Reviewed-by: Magnus Lindholm <linmag7@gmail.com>
Tested-by: Magnus Lindholm <linmag7@gmail.com>
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
arch/alpha/include/asm/perf_event.h | 2 ++
arch/alpha/include/uapi/asm/perf_event.h | 31 +++++++++++++++++++++++++++++++
arch/alpha/kernel/perf_event.c | 22 +++++++++++++++++++---
3 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/arch/alpha/include/asm/perf_event.h b/arch/alpha/include/asm/perf_event.h
index 72536566014a..f498c1d47c07 100644
--- a/arch/alpha/include/asm/perf_event.h
+++ b/arch/alpha/include/asm/perf_event.h
@@ -1,6 +1,8 @@
#ifndef __ASM_ALPHA_PERF_EVENT_H
#define __ASM_ALPHA_PERF_EVENT_H
+#include <uapi/asm/perf_event.h>
+
/*
* Software events have no trap frame, so perf_fetch_caller_regs() fills
* in a zeroed pt_regs. A zero ps already means kernel mode; only pc is
diff --git a/arch/alpha/include/uapi/asm/perf_event.h b/arch/alpha/include/uapi/asm/perf_event.h
new file mode 100644
index 000000000000..aa0eff5a917c
--- /dev/null
+++ b/arch/alpha/include/uapi/asm/perf_event.h
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _UAPI_ASM_ALPHA_PERF_EVENT_H
+#define _UAPI_ASM_ALPHA_PERF_EVENT_H
+
+#include <linux/types.h>
+
+/*
+ * PERF_SAMPLE_RAW payload of a ProfileMe sample from the cpu PMU.
+ *
+ * pmpc, i_stat and pctr_ctl are the values of the PMPC, I_STAT and
+ * PCTR_CTL registers when the ProfileMe window closed. i_stat holds only
+ * bits 40:30 and pctr_ctl only bits 47:0. See the EV67/EV68 Hardware
+ * Reference Manuals for the field layout.
+ *
+ * In the sample record the payload follows the 32-bit PERF_SAMPLE_RAW
+ * size, so it starts 4 bytes past an 8-byte boundary. The 64-bit fields
+ * are packed after the 32-bit version so that they are 8-byte aligned in
+ * the record and no padding follows the payload.
+ *
+ * Fields may be added to the end in later versions.
+ */
+#define ALPHA_PROFILEME_SAMPLE_VERSION 1
+
+struct alpha_profileme_sample {
+ __u32 version;
+ __u64 pmpc __attribute__((packed));
+ __u64 i_stat __attribute__((packed));
+ __u64 pctr_ctl __attribute__((packed));
+};
+
+#endif /* _UAPI_ASM_ALPHA_PERF_EVENT_H */
diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c
index a6ef71e7e30b..5f8f948a973f 100644
--- a/arch/alpha/kernel/perf_event.c
+++ b/arch/alpha/kernel/perf_event.c
@@ -1037,11 +1037,14 @@ static void alpha_perf_event_profileme(struct perf_event *event,
struct hw_perf_event *hwc,
struct pt_regs *regs, long ovf)
{
+ struct alpha_profileme_sample pm;
+ struct perf_raw_record raw;
struct perf_sample_data data;
struct pt_regs *pm_regs;
bool pc_only = false;
- unsigned long i_stat, pmpc, ovr, pc, saved_pc, saved_ps;
+ unsigned long pctr_ctl, i_stat, pmpc, ovr, pc, saved_pc, saved_ps;
+ pctr_ctl = wrperfmon(PERFMON_CMD_READ, 0);
i_stat = wrperfmon(PERFMON_CMD_I_STAT, 0);
pmpc = wrperfmon(PERFMON_CMD_PMPC, 0);
@@ -1078,8 +1081,8 @@ static void alpha_perf_event_profileme(struct perf_event *event,
* happens for ITB miss, Istream access violation and interrupt
* redirects, and for instructions inside PALcode. Keep the
* interrupted PC, which for redirects is the instruction that
- * trapped. Do the same for a user PMPC in a kernel thread, which has
- * no user frame.
+ * trapped, and report the real PMPC in the raw data. Do the same
+ * for a user PMPC in a kernel thread, which has no user frame.
*/
pm_regs = regs;
pc = pmpc & EV67_PMPC_PC_MASK;
@@ -1113,6 +1116,19 @@ static void alpha_perf_event_profileme(struct perf_event *event,
else if (in_entry_save_code(pc) && is_user_task(current))
alpha_profileme_set_regs_user(event, &data);
+ pm.version = ALPHA_PROFILEME_SAMPLE_VERSION;
+ pm.pmpc = pmpc;
+ pm.i_stat = i_stat;
+ /* PALcode sign-extends bit 47 of PCTR_CTL. */
+ pm.pctr_ctl = pctr_ctl & GENMASK(47, 0);
+ raw = (struct perf_raw_record) {
+ .frag = {
+ .size = sizeof(pm),
+ .data = &pm,
+ },
+ };
+ perf_sample_save_raw_data(&data, event, &raw);
+
if (!alpha_perf_event_set_period(event, hwc, 0))
return;
--
2.55.0
next prev parent reply other threads:[~2026-11-06 4:30 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 4:30 [PATCH v7 00/14] alpha/perf: add ProfileMe sampling Matt Turner
2026-11-06 4:30 ` [PATCH v7 01/14] alpha/perf: do not update an event that has no counter in alpha_pmu_del() Matt Turner
2026-11-06 4:41 ` sashiko-bot
2026-11-09 22:50 ` Magnus Lindholm
2026-11-06 4:30 ` [PATCH v7 02/14] alpha/perf: pass PERFMON_CMD_LOGGING_ALL to the logging options call Matt Turner
2026-11-06 4:33 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 03/14] alpha/perf: add sysfs format and event attributes Matt Turner
2026-11-06 4:35 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 04/14] alpha/perf: clear PERF_HES_UPTODATE when an event starts counting Matt Turner
2026-11-06 4:39 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 05/14] alpha/perf: do not report user registers from the entry code Matt Turner
2026-11-06 4:46 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 06/14] alpha/perf: ignore overflow interrupts the counter does not account for Matt Turner
2026-11-06 4:54 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 07/14] alpha/perf: implement ProfileMe sampling Matt Turner
2026-11-06 5:06 ` sashiko-bot
2026-11-06 4:30 ` Matt Turner [this message]
2026-11-06 5:00 ` [PATCH v7 08/14] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data sashiko-bot
2026-11-06 4:30 ` [PATCH v7 09/14] alpha/perf: optionally randomize the ProfileMe sampling interval Matt Turner
2026-11-06 5:06 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 10/14] alpha/perf: report the ProfileMe window count as the sample weight Matt Turner
2026-11-06 5:09 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 11/14] alpha/perf: report the data source of ProfileMe memory accesses Matt Turner
2026-11-06 5:13 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 12/14] alpha/perf: add ProfileMe sample filters Matt Turner
2026-11-06 5:13 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 13/14] alpha/perf: sample only retired instructions for precise events Matt Turner
2026-11-06 5:14 ` sashiko-bot
2026-11-06 4:30 ` [PATCH v7 14/14] alpha/perf: honor exclude_user and exclude_kernel for ProfileMe events Matt Turner
2026-11-06 5:44 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261105-alpha-profileme-v7-8-c474e892abb0@gmail.com \
--to=mattst88@gmail.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linmag7@gmail.com \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mcree@orcon.net.nz \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.