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 v6 00/13] alpha/perf: add ProfileMe sampling
Date: Wed, 04 Nov 2026 13:49:07 -0500 [thread overview]
Message-ID: <20261104-alpha-profileme-v6-0-63362e9290a3@gmail.com> (raw)
The 21264 from EV67 on, and the 21364, have a second performance counter
mode, ProfileMe, alongside the Aggregate mode that the driver uses today.
An Aggregate mode sample reports the PC where the overflow interrupt was
taken. On an EV7 that is anywhere from 15 instructions before to 12
after the one that overflowed the counter, which makes perf annotate
output close to useless. In ProfileMe mode the CPU picks one fetched
instruction, follows it down the pipeline, and reports its PC along with
what happened to it: whether it retired, whether it trapped and why,
whether it was a mispredicted branch, stalled before map, or was killed
on a wrong path, and what PCTR1 counted while it was in flight.
Patch 1 fixes a constant passed to the wrong PALcode call, with no
functional change. Patch 2 adds the sysfs format and event attributes
the perf tool needs to name raw events. Patch 3 fixes counts lost when
an event is stopped before its first start, and patch 4 stops reporting
user registers that the entry code has not saved yet. Patch 5 ignores
counter interrupts that were pending when the counter was rewritten,
and stops counting an overflow twice when a read races its interrupt.
Patch 6 adds ProfileMe sampling, selected with precise_ip or a new
profileme config bit, so cycles:p and perf record's default event use
it. Patch 7 attaches the status registers to each sample as
PERF_SAMPLE_RAW data, and patch 8 adds an option to randomize the
sampling interval so that it cannot lock onto a loop. Patches 9 and 10
report what PCTR1 counted as the sample weight and the data source of
memory accesses, DTB hits and misses. Patch 11 adds filters that keep
only retired, mispredicted or trapping instructions, and patch 12 makes
precise events sample only retired ones. Patch 13 lets ProfileMe events
exclude user or kernel samples, so that perf record works without root
at the default perf_event_paranoid.
A separate series for perf-tools-next adds a decoder for the raw data
to perf report -D and perf script -D, and a script that sums the status
by symbol or by instruction, in the style of DCPI, and a perf mem event.
The two modes cannot run at the same time, because PCTR_CTL[SL0] sets
the mode for both counters. A ProfileMe event is scheduled alone, and
perf multiplexes it with any other hardware events. perf stat does not
ask for precise events, so it keeps using Aggregate mode.
To try it:
perf record -e cycles:p -- ./workload
perf annotate
I tested this on an AlphaServer ES47 (EV7). Samples from a
16-instruction loop land on all 16 instructions rather than on 4 PCs.
DTB misses and unaligned traps are attributed to the faulting load. A
branch on random data shows up as mispredicted in 21% of its samples,
and in 0% with sorted data. A 12 minute perf record -a while building
git took 4.45 million samples with no warnings. Sampling every 10000
instructions, which used to wedge the CPU, ran 66 times without a hang.
With precise_ip, killed instructions went from 67% of the samples of a
mispredicting loop to none. On two CPUs, this version survived 62 runs
that mix sampling, filters, context switches and multiplexing, with no
warnings. As a normal user, perf record took 8763 samples, none of them
in the kernel.
Signed-off-by: Matt Turner <mattst88@gmail.com>
---
Changes in v6:
- New patch 5: ignore an overflow interrupt for a counter that has not
overflowed since it was written, and do not count an overflow twice
when a read races its interrupt. Counters are now written at most
half their range below overflow, so the two can be told apart.
Suggested by Ian Rogers, after Sashiko found that a PCTR1 interrupt
pending when a ProfileMe event was scheduled in was taken as a
window close.
- Patch 6: drop the stopped event check and the caveat about stale
interrupts, which patch 5 now covers.
- Patch 10: also report a memory access that retired without a DTB
miss trap as a DTB hit, a load into $31 or $f31 as a prefetch, and
leave out the ldq_u UNOP. Thanks to Ian Rogers.
- Patch 12: say in the commit message that the kept samples carry the
full period, so the sample rate in frequency mode falls by the
killed fraction. Thanks to Ian Rogers.
- New patch 13: honor exclude_user and exclude_kernel for ProfileMe
events by dropping samples, so perf record works without root.
Suggested by Ian Rogers.
- Link to v5: https://patch.msgid.link/20261103-alpha-profileme-v5-0-bbe3937fbf3a@gmail.com
Changes in v5:
- Patch 5: refuse precise_ip 3, as a sample with a PALmode PMPC keeps
the interrupted PC. Thanks to Magnus Lindholm.
- New patches 8 to 11, from Ian Rogers' suggestions: the sample weight,
the data source of DTB misses, config1 filters, and retired-only
precise samples. The last changes what a default perf record shows.
- Link to v4: https://patch.msgid.link/20261102-alpha-profileme-v4-0-61e00f5e1da8@gmail.com
Changes in v4:
- Patch 4: move __entry_save_end past the r16-r18 stores in entSys,
as PAL_callsys does not save them and interrupts are still enabled
there.
- Patch 5: report the user registers when the profiled instruction is
in the entry code but the interrupt was taken after it, since
perf_get_regs_user() sees the PMPC rather than the interrupted PC.
- Link to v3: https://patch.msgid.link/20261101-alpha-profileme-v3-0-92d511b5a044@gmail.com
Changes in v3:
- New patch 3: clear PERF_HES_UPTODATE when an event starts counting,
so that a stop before the first start does not lose the count.
- New patch 4: report no user registers for a sample taken in the entry
code, where the frame at task_pt_regs() is not complete. An interrupt
nested on one taken there is still not caught.
- Patch 5: a user instruction whose interrupt is taken in the kernel now
reports its PC with no registers or user stack, as the frame at
task_pt_regs() may not be built yet. Thanks to Magnus Lindholm for
finding this and for the fix.
- Patch 5: also move the counter away from overflow when a ProfileMe
event is removed, or stopped without PERF_EF_UPDATE, as
alpha_pmu_del() does not go through alpha_pmu_stop().
- Patch 5: ignore an interrupt that was pending when the event was
stopped. Document that rewriting a counter does not cancel one.
- Link to v2: https://patch.msgid.link/20261030-alpha-profileme-v2-0-c702f1c65272@gmail.com
Changes in v2:
- Patch 1: explain why bit 0 clear means all processes, although the
Architecture Reference Manual says otherwise.
- Patch 3: fix a CPU wedge during high-rate ProfileMe sampling. The
ProfileMe counters are now written twice, and a stopped counter is
moved away from overflow, as EV67 HRM PALcode restrictions 32 and 38
require.
- Patch 3: set the profiled PC in place in the trap frame of the
instruction's mode instead of in a pt_regs copy on the stack, so
sampled registers and stack values are those of the right frame.
A kernel instruction whose interrupt is taken in user mode gets a
per-CPU frame holding only its PC, so the user frame is not changed.
- Patch 4: drop the reserved field and pack the 64-bit fields of
struct alpha_profileme_sample, so they are 8-byte aligned in the
sample record and the record needs no padding. This changes the raw
data layout.
- Patch 5: compute the jitter with mul_u64_u32_shr() and saturate the
sum, so that large periods cannot overflow.
- Link to v1: https://patch.msgid.link/20261028-alpha-profileme-v1-0-d44b52bf2500@gmail.com
---
Matt Turner (13):
alpha/perf: pass PERFMON_CMD_LOGGING_ALL to the logging options call
alpha/perf: add sysfs format and event attributes
alpha/perf: clear PERF_HES_UPTODATE when an event starts counting
alpha/perf: do not report user registers from the entry code
alpha/perf: ignore overflow interrupts the counter does not account for
alpha/perf: implement ProfileMe sampling
alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data
alpha/perf: optionally randomize the ProfileMe sampling interval
alpha/perf: report the ProfileMe window count as the sample weight
alpha/perf: report the data source of ProfileMe memory accesses
alpha/perf: add ProfileMe sample filters
alpha/perf: sample only retired instructions for precise events
alpha/perf: honor exclude_user and exclude_kernel for ProfileMe events
arch/alpha/include/asm/perf_event.h | 2 +
arch/alpha/include/asm/ptrace.h | 12 +
arch/alpha/include/asm/wrperfmon.h | 36 ++
arch/alpha/include/uapi/asm/perf_event.h | 31 ++
arch/alpha/kernel/entry.S | 9 +
arch/alpha/kernel/perf_event.c | 660 ++++++++++++++++++++++++++++++-
arch/alpha/kernel/perf_regs.c | 13 +
7 files changed, 742 insertions(+), 21 deletions(-)
---
base-commit: 330517c63aa9b48227b6ab45f01003effac77ae4
change-id: 20261024-alpha-profileme-6e98a977cb54
Best regards,
--
Matt Turner <mattst88@gmail.com>
next reply other threads:[~2026-11-04 18:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 18:49 Matt Turner [this message]
2026-11-04 18:49 ` [PATCH v6 01/13] alpha/perf: pass PERFMON_CMD_LOGGING_ALL to the logging options call Matt Turner
2026-11-04 18:49 ` [PATCH v6 02/13] alpha/perf: add sysfs format and event attributes Matt Turner
2026-11-04 18:49 ` [PATCH v6 03/13] alpha/perf: clear PERF_HES_UPTODATE when an event starts counting Matt Turner
2026-11-04 18:49 ` [PATCH v6 04/13] alpha/perf: do not report user registers from the entry code Matt Turner
2026-11-04 18:49 ` [PATCH v6 05/13] alpha/perf: ignore overflow interrupts the counter does not account for Matt Turner
2026-11-04 21:54 ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 06/13] alpha/perf: implement ProfileMe sampling Matt Turner
2026-11-04 21:57 ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 07/13] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data Matt Turner
2026-11-04 18:49 ` [PATCH v6 08/13] alpha/perf: optionally randomize the ProfileMe sampling interval Matt Turner
2026-11-04 18:49 ` [PATCH v6 09/13] alpha/perf: report the ProfileMe window count as the sample weight Matt Turner
2026-11-04 22:11 ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 10/13] alpha/perf: report the data source of ProfileMe memory accesses Matt Turner
2026-11-04 22:31 ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 11/13] alpha/perf: add ProfileMe sample filters Matt Turner
2026-11-04 18:49 ` [PATCH v6 12/13] alpha/perf: sample only retired instructions for precise events Matt Turner
2026-11-04 18:49 ` [PATCH v6 13/13] alpha/perf: honor exclude_user and exclude_kernel for ProfileMe events 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=20261104-alpha-profileme-v6-0-63362e9290a3@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®