Messages in this thread |  | | From | Pu Hu <> | | Subject | [RFC 0/3] arm64: kprobes: Fix single-step fault and reentry handling | | Date | Mon, 6 Jul 2026 08:36:46 +0000 |
| |
From: Pu Hu <hupu@transsion.com>
This series fixes two arm64 kprobes issues observed when running simpleperf with preemptirq tracepoints and dwarf callchains while a kprobe is active on a frequently executed kernel function.
The crash happens in the kprobe debug exception path. While a kprobe is preparing or executing its XOL single-step instruction, perf/trace code can run in the same window. That code may either take a fault of its own or hit another kprobe.
Patch 1 makes kprobe_fault_handler() handle a fault in KPROBE_HIT_SS/KPROBE_REENTER only when the faulting PC points at the current kprobe's XOL instruction. Otherwise the fault is left to the normal fault handling path.
Patch 2 allows a kprobe hit in KPROBE_HIT_SS to be handled as a recoverable one-level reentry. Only a hit while already in KPROBE_REENTER remains unrecoverable.
Patch 3 adds a kprobes selftest which registers a kprobe on a frequently executed filemap fault path and drives repeated file-backed page faults from userspace. This provides a smaller reproducer for validating the fault handling fix.
This follows the same logic as the existing x86 fixes: 6381c24cd6d5 ("kprobes/x86: Fix page-fault handling logic") 6a5022a56ac3 ("kprobes/x86: Allow to handle reentered kprobe on single-stepping")
Reproducer:
simpleperf record -p <pid> -f 10000 \ -e preemptirq:preempt_disable \ -e preemptirq:preempt_enable \ --duration 9 --call-graph dwarf \ -o /data/local/tmp/perf.data
The new selftest can be built from tools/testing/selftests/kprobe/ and used to exercise the page fault handling path with the test kprobe module loaded.
Before this series, the crash reproduced frequently. With both patches applied, it was no longer reproduced in our testing.
Pu Hu (3): arm64: kprobes: Do not handle non-XOL faults as kprobe faults arm64: kprobes: Allow reentering kprobes while single-stepping selftests/kprobes: Add kprobe stress test for page fault handling
arch/arm64/kernel/probes/kprobes.c | 22 +++- tools/testing/selftests/kprobe/.gitignore | 2 + tools/testing/selftests/kprobe/Makefile | 75 +++++++++++++ tools/testing/selftests/kprobe/fault_stress.c | 105 ++++++++++++++++++ .../selftests/kprobe/kprobe_folio_stress.c | 70 ++++++++++++ 5 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/kprobe/.gitignore create mode 100644 tools/testing/selftests/kprobe/Makefile create mode 100644 tools/testing/selftests/kprobe/fault_stress.c create mode 100644 tools/testing/selftests/kprobe/kprobe_folio_stress.c
-- 2.43.0
|  |