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 drain the AUX buffer directly.

Userspace allocates AUX buffers through perf_event_open() and mmap().
Kernel consumers created through perf_event_create_kernel_counter()
currently lack an equivalent interface.

This series adds perf-core APIs for kernel consumers to allocate and
release AUX buffers, read the producer head, copy trace data, and
advance the consumer tail.  The APIs keep perf's internal page layout
private and follow the existing non-overwrite AUX ring-buffer
protocol.  Setup and release serialize buffer attachment and
detachment through event->mmap_mutex; consumers must quiesce before
releasing the buffer.

Patches 1-2 add the ownership, lifecycle, and access APIs.  Patches
3-5 add KUnit tests, a userspace AUX 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.

Testing
=======

The series builds cleanly at each step.

arm64 (Kunpeng 920, 256 CPUs, SPEv1.1): built and booted the Image
from this series.  KUnit: pass:39 fail:0 skip:0.  The arm_spe_0
userspace regression test passed, and the AUX head advanced under
live SPE traffic.  Selftest script: 92 passed, 0 failed, 2 skipped.
perf record with arm_spe_0 captured data; dmesg showed no warnings.

x86_64 (vmlinux build, qemu/kvm): KUnit pass:39 fail:0 skip:0,
including KASAN and lockdep (PROVE_LOCKING); 15 repeated boots
produced no splats.  The Intel PT userspace regression test passed.

Signed-off-by: Kunwu Chan <[email protected]>

Changes since v1 [2]:

- Fix double-release in KUnit error cleanup and make the coexistence
  test cleanup failure-safe.
- Make failure-sensitive userspace test outcomes report SKIP rather
  than PASS, read the AUX head after event disable to observe flushed
  trace data, and pass the PMU name from the script to the C test.
- Fix the selftest script exit-status handling, remove the
  /usr/src/linux fallback, and handle Intel PT event modifiers.
- Remove an unnecessary smp_rmb() from the tail update path.

Changes since RFC [1]:

- Serialize AUX teardown under event->mmap_mutex and fix lifetime
  handling around ring_buffer_attach().
- Improve KUnit cleanup and concurrent-release coverage.
- Extend userspace and selftest coverage.
- Document AUX lifecycle, ordering, and cursor validation.

[1] 
https://lore.kernel.org/linux-perf-users/[email protected]/
[2] https://lore.kernel.org/all/[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               | 1172 +++++++++++++++++
 kernel/events/core.c                          |  164 +++
 kernel/events/internal.h                      |    6 +
 kernel/events/ring_buffer.c                   |  212 ++-
 lib/Kconfig.debug                             |   14 +
 tools/testing/selftests/perf_events/Makefile  |    2 +
 .../selftests/perf_events/aux_kernel.sh       |  635 +++++++++
 .../perf_events/aux_kernel_usermode.c         |  645 +++++++++
 tools/testing/selftests/perf_events/config    |    2 +
 12 files changed, 2928 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


Reply via email to