mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [RFC PATCH 0/2] perf: user stack dump on sparc64 needs an arch hook
@ 2026-09-22 13:56 Stian Halseth
  2026-09-22 13:56 ` [RFC PATCH 1/2] perf/core: Let an arch prepare the user stack before it is dumped Stian Halseth
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Stian Halseth @ 2026-09-22 13:56 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Andreas Larsson, David S. Miller
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland,
	Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
	James Clark, linux-perf-users, sparclinux, linux-kernel,
	Stian Halseth

I am adding HAVE_PERF_REGS and HAVE_PERF_USER_STACK_DUMP to sparc64, so
that perf record --call-graph dwarf and elfutils' eu-stackprof work
there. The sparc side (patch 2) is straightforward and follows parisc.
One thing does not fit in arch code, and I would like to get the shape
of that agreed before sending the rest.

The user stack dump copies the stack as it is in memory and assumes the
call chain is there. On sparc it may not be: the sampled register
window's %l/%i registers, which hold the frame pointer and return
address the unwinder starts from (the CFI after `save` defines the CFA
in terms of %i6), stay in the register file until a window spills. The
kernel already deals with this wherever it exposes user stack memory:
perf_callchain_user() on sparc calls flushw_user() before walking the
chain, and ptrace does the same. The stack dump has no arch entry
point where that could happen.

I looked for a sparc-only way and did not find a correct one:

- flushing in the sparc PMU interrupt handler misses software events
  (cpu-clock, tracepoints), which reach perf_event_overflow() without
  passing through it;
- perf_user_stack_pointer() is private to kernel/events/internal.h, so
  the arch cannot override it;
- perf_reg_abi() is called at the right time but is a query, and a
  flush as a side effect of it would be wrong.

So patch 1 adds a no-op hook in the style of perf_arch_misc_flags():
perf_arch_prepare_ustack(), called from perf_prepare_sample() when
PERF_SAMPLE_STACK_USER is requested and user regs exist. Patch 2 is the
sparc64 implementation and its user. Happy to take a different name or
placement.

Tested on an UltraSPARC T4-1 on 7.3-rc4 with a perf tool taught the
sparc registers (that patch, and the matching elfutils backend, follow
once the hook is settled): register values check out against known
contents, and --call-graph dwarf unwinds correctly for both cycles and
cpu-clock. perf stat/record/record -g are unchanged.

Link: https://github.com/sparclinux/issues/issues/99

Stian Halseth (2):
  perf/core: Let an arch prepare the user stack before it is dumped
  sparc64: Support PERF_SAMPLE_REGS_USER and PERF_SAMPLE_STACK_USER

 arch/sparc/Kconfig                      |  2 +
 arch/sparc/include/asm/perf_event.h     |  3 ++
 arch/sparc/include/uapi/asm/perf_regs.h | 33 +++++++++++++
 arch/sparc/kernel/Makefile              |  2 +-
 arch/sparc/kernel/perf_regs.c           | 65 +++++++++++++++++++++++++
 include/linux/perf_event.h              |  7 +++
 kernel/events/core.c                    |  2 +
 7 files changed, 113 insertions(+), 1 deletion(-)
 create mode 100644 arch/sparc/include/uapi/asm/perf_regs.h
 create mode 100644 arch/sparc/kernel/perf_regs.c

--
2.55.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-09-22 20:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-22 13:56 [RFC PATCH 0/2] perf: user stack dump on sparc64 needs an arch hook Stian Halseth
2026-09-22 13:56 ` [RFC PATCH 1/2] perf/core: Let an arch prepare the user stack before it is dumped Stian Halseth
2026-09-22 13:56 ` [RFC PATCH 2/2] sparc64: Support PERF_SAMPLE_REGS_USER and PERF_SAMPLE_STACK_USER Stian Halseth
2026-09-22 17:04 ` [RFC PATCH 0/2] perf: user stack dump on sparc64 needs an arch hook Magnus Lindholm
2026-09-22 20:02   ` Stian Halseth

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®