[RFC PATCH 0/4] kcsan: add targeted watchpoint sampling

From: Hui Su

Date: Wed Oct 14 2026 - 05:55:13 EST


Hi,

While investigating a low-frequency scheduler access around `calc_load_idx` in
`kernel/sched/loadavg.c`, I found that KCSAN's per-CPU `kcsan.skip_watch`
interval can make focused reproduction difficult. Unrelated instrumented
accesses on the same CPUs may consume the interval before execution reaches a
known suspicious address. This is a limitation in focused-debugging control;
the proposal leaves the default sampling policy unchanged.

Setting `kcsan.skip_watch=0` removes the interval globally and can make
watchpoint setup much more frequent for all eligible accesses. The existing
debugfs whitelist and blacklist filter which reports are emitted after
watchpoint selection; they do not select which addresses may set up a
watchpoint. There is currently no runtime control to focus setup attempts on
one known address while leaving unrelated accesses out of that selection.

This RFC adds an optional single-address target to the KCSAN debugfs
interface. When enabled, a non-atomic access is eligible to set up a watchpoint
only when its byte range contains the target address. Matching accesses bypass
the normal `kcsan.skip_watch` interval; nonmatching accesses neither set up a
watchpoint nor consume that interval. The target can be specified as an address
or a kallsyms symbol, including `module:symbol`; `target=off` restores normal
sampling. A static key guards the disabled path.

Patch 1 adds single-address target matching and the static-key-guarded runtime
state. Patch 2 exposes address and symbol targets through debugfs, patch 3
tests the matching semantics, and patch 4 documents the interface and its
performance implications. The standalone integration module used for runtime
checks is local and is not included in the series.

Testing:
- x86_64 GCC and Clang `bzImage modules` builds completed, and the candidate's
built-in KCSAN selftest passed 4/4. Runtime validation recorded setup
activity for exact-address and `module:symbol` targets, none for a
nonmatching target, and normal sampling after `target=off`.
- In a separate motivating loadavg run, targeting `calc_load_idx` produced a
KCSAN report involving `calc_global_load()` and `calc_load_nohz_start()`. A
separate upstream run with the default `skip_watch=4000` did not report
those locations during its test window.
- Across 10 rounds of 1,000,000 accesses, medians were `24.549 ns/access`
upstream, `24.654 ns/access` with targeting disabled, and `26.981 ns/access`
with an enabled nonmatching target. The disabled-path results were
indistinguishable at this measurement granularity. A separate 10-round,
10,000-access hot-match run measured `81.1 us/access`: every matching
access enters `kcsan_setup_watchpoint()`, so this includes setup slow-path
work and represents focused debugging rather than normal use.

Questions for discussion:
1. Is address-targeted watchpoint sampling a useful primitive for focused
KCSAN debugging?
2. Should matching accesses bypass the normal `kcsan.skip_watch` interval, as
proposed here, or should targeted mode retain its own sampling interval?
3. Is the existing KCSAN debugfs file an appropriate interface for configuring
a single target?

Hui Su (4):
kcsan: add targeted watchpoint matching
kcsan: add debugfs target control
kcsan: add targeted watchpoint selftest
docs: kcsan: document targeted watchpoint sampling

Documentation/dev-tools/kcsan.rst | 17 ++++++++++++++
kernel/kcsan/core.c | 37 +++++++++++++++++++++++++++++++
kernel/kcsan/debugfs.c | 28 ++++++++++++++++++++++-
kernel/kcsan/kcsan.h | 10 +++++++++
kernel/kcsan/selftest.c | 29 ++++++++++++++++++++++++
5 files changed, 120 insertions(+), 1 deletion(-)


base-commit: 4056b3c9d3c92ea45955641dbafeb9b960e146ef
--
2.55.0