ARM SPE and other tracing PMUs write records directly to perf AUX buffers. Unlike ordinary sampling PMUs, they do not necessarily generate a perf_event_overflow() callback for each record. A kernel consumer therefore needs to own and drain an AUX buffer rather than rely on the overflow path.
Userspace obtains AUX storage through perf_event_open() and mmap(). Kernel consumers created through perf_event_create_kernel_counter() currently have no interface to allocate and manage AUX buffers. This series adds the minimal perf-core interfaces needed for that use case. It was previously posted as RFC [1]; this version incorporates feedback from that posting and is intended for review toward merging. Patches 1-2 add the AUX owner interface, lifecycle helpers, and cursor/copy operations without exposing perf's internal page layout. Patches 3-5 exercise the new interfaces with KUnit, a userspace regression test, and a selftest script. The first consumer is a DAMON ARM SPE backend, but this series is independent of DAMON and adds no consumer-specific policy to perf. The API follows the existing non-overwrite AUX ring-buffer protocol. Setup and release serialise buffer lifetime transitions through event->mmap_mutex. Cursor reads/writes use the same ordering rules as the userspace mmap consumer, and copy validates ranges in the absolute cursor domain before applying the ring mask. Testing ======= The series builds cleanly at each step. arm64 (Kunpeng 920, 256 CPUs, SPEv1.1), Image built from this series and booted on the hardware: KUnit: pass:39 fail:0 skip:0. Userspace regression (arm_spe_0): full pass; the producer head advances with live SPE traffic. Selftest script: 92 passed, 0 failed, 2 skipped (both environment skips). perf record with arm_spe_0 captures data; dmesg stays clean. x86_64 (vmlinux build, qemu/kvm): KUnit pass:39 fail:0 skip:0, also under KASAN + lockdep (PROVE_LOCKING) and 15 repeated boots with no splat. Userspace regression (Intel PT): full pass. The selftest script also runs from installed selftest locations. Signed-off-by: Kunwu Chan <[email protected]> Changes since RFC [1]: - Serialize AUX teardown under event->mmap_mutex and fix lifetime handling around ring_buffer_attach(). - Improve KUnit cleanup, concurrent-release coverage, and buffer-full assertions. - Extend userspace and selftest coverage, including environment handling fixes and installed selftest support. - Clarify AUX lifecycle, ordering, and cursor validation documentation. [1] https://lore.kernel.org/linux-perf-users/[email protected]/ Kunwu Chan (3): perf/core: add AUX buffer ownership for kernel events perf/core: add AUX ring accessors for kernel consumers selftests/perf_events: add AUX kernel API selftest script Lian Wang (2): perf/core: add KUnit tests for AUX kernel-consumer API selftests/perf_events: add userspace AUX regression test .../userspace-api/perf_ring_buffer.rst | 62 +- include/linux/perf_event.h | 18 + kernel/events/Makefile | 1 + kernel/events/aux_kernel_test.c | 1152 +++++++++++++++++ kernel/events/core.c | 164 +++ kernel/events/internal.h | 6 + kernel/events/ring_buffer.c | 211 ++- lib/Kconfig.debug | 14 + tools/testing/selftests/perf_events/Makefile | 2 + .../selftests/perf_events/aux_kernel.sh | 631 +++++++++ .../perf_events/aux_kernel_usermode.c | 627 +++++++++ tools/testing/selftests/perf_events/config | 2 + 12 files changed, 2885 insertions(+), 5 deletions(-) create mode 100644 kernel/events/aux_kernel_test.c create mode 100755 tools/testing/selftests/perf_events/aux_kernel.sh create mode 100644 tools/testing/selftests/perf_events/aux_kernel_usermode.c base-commit: 6350de8671b94afb7691d110f63bcda42f658a69 -- 2.43.0

