[PATCH v7 00/10] riscv: Add reliable stack unwinding for livepatch
Shuai Xue
xueshuai at linux.alibaba.com
Mon Nov 9 17:37:40 PST 2026
Hi,
This is v7 of the RISC-V reliable stack unwinding series for livepatch.
The series starts with three standalone fixes for the existing stack
walkers: Karl Mehltretter's fix for arch_stack_walk() reporting the
walker's own frame, its KUnit test, and a fix for the function-graph
return-address cookie that Martin Kaiser asked to be split out. The
main part of the series then adds explicit frame-record metadata,
preserves the frame pointer through dynamic ftrace, replaces the
open-coded stack walker with a conservative frame-pointer based
unwinder, enables the RISC-V livepatch capability and adds the
syscall-wrapper selftest prefix.
Changes since v6:
* Rebase onto the current riscv/for-next (based on 7.4-rc1).
* Fold in Karl Mehltretter's two patches [1] as 1/10 and 2/10. Patch
1/10 stops arch_stack_walk() from reporting the walker's own frame as
the first entry, which corrupts the skip-frame accounting of
stack_trace_save() users (page_owner, perf), and adjusts
return_address() level accounting accordingly. Patch 2/10 adds a KUnit
test for the start frames. Both patches keep their original authorship;
I added my Reviewed-by/Tested-by and sign-off. I asked Karl on
3 November whether he would like to see his patches folded into this
series; he has not replied so far. Since 8/10 reuses the walker
extraction from 1/10 for its !CONFIG_FRAME_POINTER fallback, his
patches are included here to keep the series self-contained.
* Split the function-graph return-address cookie change out of the old
5/7, as suggested by Martin Kaiser. It is now a separate patch (3/10)
that also fixes the old walker's cookie key, so it stands on its own
without the rest of the series and can be picked independently; it is
marked Fixes: and Cc: stable.
* Reworked the !CONFIG_FRAME_POINTER fallback of the unwinder switch
patch (8/10) to use the __always_inline __walk_stackframe() helper
from 1/10, so both walkers report the same start frame.
* Collected tags from the v6 review thread: Reviewed-by and Tested-by:
Martin Kaiser for the patches carried over from v6 (rv64 QEMU and
rv64 CHERI builds, livepatch working on both).
The patches carried over from v6 are unchanged, except for the
reworked !CONFIG_FRAME_POINTER fallback in 8/10, so the v6 validation
results still apply to them. The v7-specific changes were covered by
the fresh build and boot runs described below:
* Built with riscv64-unknown-linux-gnu-gcc 15.2.0 and binutils 2.46,
including a CONFIG_IRQ_STACKS=n variant.
* QEMU 8.2.2, 1 and 4 CPUs: livepatch selftests PASS: 7, SKIP: 1,
FAIL: 0; ftrace function graph 3 passed, 0 failed, 3 unsupported.
* No BUG, WARNING, Oops, panic, unreliable stack or Call Trace found by
the validation log scans.
Patches 1-2/10 were tested by Karl with the KUnit suite from 2/10 on
QEMU's virt machine with clang 22 (LLVM=1) and GCC 15.2, and on a
BeagleV Ahead (TH1520), where all five test cases pass.
In addition, the combined v7 tree was freshly built and booted:
* Built with riscv64-unknown-linux-gnu-gcc 16.2.0 on top of 7.4-rc1:
a full livepatch configuration (CONFIG_LIVEPATCH=y with dynamic ftrace
and function graph tracer) and a !CONFIG_FRAME_POINTER variant both
link successfully.
* QEMU 11.1.1, rv64 virt, 4 CPUs: the KUnit suite from 2/10 passes
5/5 on the frame-pointer build; the !CONFIG_FRAME_POINTER build boots
and its panic backtrace (no initramfs, by design) unwinds cleanly.
Base:
riscv/for-next 6628e7d4c6b2 ("Linux 7.4-rc1")
Previous versions:
v6: https://lore.kernel.org/r/20260914092648.51254-1-xueshuai@linux.alibaba.com
v5: https://lore.kernel.org/r/20260804103626.2803112-1-wanghan@linux.alibaba.com
v4 RESEND: https://lore.kernel.org/r/20260629072713.3273743-1-wanghan@linux.alibaba.com
v3: https://lore.kernel.org/r/cover.194d76e3a15b.v3.riscv-livepatch.wanghan@linux.alibaba.com
v2: https://lore.kernel.org/r/20260528082310.1994388-1-wanghan@linux.alibaba.com
v1: https://lore.kernel.org/r/20260527123530.2593918-1-wanghan@linux.alibaba.com
[1] https://lore.kernel.org/r/20261010132712.46931-1-kmehltretter@gmail.com
Karl Mehltretter (2):
riscv: stacktrace: do not report the walker's own frame from
arch_stack_walk()
riscv: Add KUnit test for stack trace start frames
Shuai Xue (1):
riscv: ftrace: use the frame pointer as the function graph
return-address cookie
Wang Han (7):
riscv: stacktrace: Add frame record metadata
riscv: stacktrace: disable KASAN and KCOV instrumentation for
stacktrace.o
riscv: ftrace: always preserve s0 in dynamic ftrace register frame
riscv: stacktrace: introduce stack-bound tracking helpers
riscv: stacktrace: switch to frame-pointer based unwinder
riscv: Kconfig: enable HAVE_RELIABLE_STACKTRACE and HAVE_LIVEPATCH
selftests/livepatch: Add RISC-V syscall wrapper prefix
arch/riscv/Kconfig | 4 +
arch/riscv/include/asm/ptrace.h | 9 +
arch/riscv/include/asm/stacktrace.h | 67 ++-
arch/riscv/include/asm/stacktrace/common.h | 159 +++++
arch/riscv/include/asm/stacktrace/frame.h | 53 ++
arch/riscv/kernel/Makefile | 6 +
arch/riscv/kernel/asm-offsets.c | 6 +
arch/riscv/kernel/entry.S | 39 +-
arch/riscv/kernel/ftrace.c | 6 +-
arch/riscv/kernel/head.S | 23 +
arch/riscv/kernel/mcount-dyn.S | 4 -
arch/riscv/kernel/perf_callchain.c | 2 +-
arch/riscv/kernel/process.c | 33 +-
arch/riscv/kernel/return_address.c | 2 +-
arch/riscv/kernel/stacktrace.c | 583 +++++++++++++++---
arch/riscv/kernel/tests/Kconfig.debug | 12 +
arch/riscv/kernel/tests/Makefile | 1 +
arch/riscv/kernel/tests/stacktrace_test.c | 142 +++++
.../livepatch/test_modules/test_klp_syscall.c | 2 +
19 files changed, 1043 insertions(+), 110 deletions(-)
create mode 100644 arch/riscv/include/asm/stacktrace/common.h
create mode 100644 arch/riscv/include/asm/stacktrace/frame.h
create mode 100644 arch/riscv/kernel/tests/stacktrace_test.c
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.39.3
More information about the linux-riscv
mailing list