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>
Cc: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org,
Matt Turner <mattst88@gmail.com>
Subject: [PATCH 4/5] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data
Date: Wed, 28 Oct 2026 14:09:33 -0400 [thread overview]
Message-ID: <20261028-alpha-profileme-v1-4-d44b52bf2500@gmail.com> (raw)
In-Reply-To: <20261028-alpha-profileme-v1-0-d44b52bf2500@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.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
arch/alpha/include/asm/perf_event.h | 2 ++
arch/alpha/include/uapi/asm/perf_event.h | 27 +++++++++++++++++++++++++++
arch/alpha/kernel/perf_event.c | 21 +++++++++++++++++++--
3 files changed, 48 insertions(+), 2 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..0cb7d6f3cb15
--- /dev/null
+++ b/arch/alpha/include/uapi/asm/perf_event.h
@@ -0,0 +1,27 @@
+/* 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.
+ *
+ * Fields may be added to the end in later versions.
+ */
+#define ALPHA_PROFILEME_SAMPLE_VERSION 1
+
+struct alpha_profileme_sample {
+ __u32 version;
+ __u32 reserved;
+ __u64 pmpc;
+ __u64 i_stat;
+ __u64 pctr_ctl;
+};
+
+#endif /* _UAPI_ASM_ALPHA_PERF_EVENT_H */
diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c
index 24c96feda942..06c9afeb7c05 100644
--- a/arch/alpha/kernel/perf_event.c
+++ b/arch/alpha/kernel/perf_event.c
@@ -915,10 +915,13 @@ static void alpha_perf_event_profileme(struct perf_event *event,
struct hw_perf_event *hwc,
struct pt_regs *regs)
{
+ struct alpha_profileme_sample pm;
+ struct perf_raw_record raw;
struct perf_sample_data data;
struct pt_regs pm_regs;
- unsigned long i_stat, pmpc, ovr;
+ unsigned long pctr_ctl, i_stat, pmpc, ovr;
+ pctr_ctl = wrperfmon(PERFMON_CMD_READ, 0);
i_stat = wrperfmon(PERFMON_CMD_I_STAT, 0);
pmpc = wrperfmon(PERFMON_CMD_PMPC, 0);
@@ -941,7 +944,7 @@ static void alpha_perf_event_profileme(struct perf_event *event,
* perf cannot resolve. That 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.
+ * instruction that trapped, and report the real PMPC in the raw data.
*/
pm_regs = *regs;
if (!(pmpc & EV67_PMPC_PAL)) {
@@ -955,6 +958,20 @@ static void alpha_perf_event_profileme(struct perf_event *event,
perf_sample_data_init(&data, 0, hwc->last_period);
+ pm.version = ALPHA_PROFILEME_SAMPLE_VERSION;
+ pm.reserved = 0;
+ 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))
perf_event_overflow(event, &data, &pm_regs);
}
--
2.55.0
next prev parent reply other threads:[~2026-10-28 18:09 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 18:09 [PATCH 0/5] alpha/perf: add ProfileMe sampling Matt Turner
2026-10-28 18:09 ` [PATCH 1/5] alpha/perf: pass PERFMON_CMD_LOGGING_ALL to the logging options call Matt Turner
2026-10-28 18:12 ` sashiko-bot
2026-10-29 17:38 ` Magnus Lindholm
2026-10-28 18:09 ` [PATCH 2/5] alpha/perf: add sysfs format and event attributes Matt Turner
2026-10-28 18:13 ` sashiko-bot
2026-10-28 18:09 ` [PATCH 3/5] alpha/perf: implement ProfileMe sampling Matt Turner
2026-10-28 18:28 ` sashiko-bot
2026-10-29 15:18 ` Magnus Lindholm
2026-10-28 18:09 ` Matt Turner [this message]
2026-10-28 18:26 ` [PATCH 4/5] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data sashiko-bot
2026-10-28 18:09 ` [PATCH 5/5] alpha/perf: optionally randomize the ProfileMe sampling interval Matt Turner
2026-10-28 18:21 ` sashiko-bot
2026-10-29 15:01 ` Magnus Lindholm
2026-10-29 9:11 ` [PATCH 0/5] alpha/perf: add ProfileMe sampling Peter Zijlstra
2026-10-29 15:34 ` Matt Turner
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=20261028-alpha-profileme-v1-4-d44b52bf2500@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=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.