[PATCH v2 0/2] perf tool_pmu: Support enable/disable for tool PMU events

From: Ian Rogers

Date: Mon May 18 2026 - 16:14:34 EST


A regression in perf stat was reported where tool PMU events (like
duration_time used in CPUs_utilized metric) incorrectly included the
delay period when using the delay option (-D).

This series fixes the regression by making tool PMU events
(duration_time, user_time, system_time) behave more like regular
counters by implementing proper enable and disable support. They now
correctly accumulate values only when enabled.

The first patch implements the core enable/disable support for tool PMU
events, and the second patch adds a shell test to verify that
duration_time correctly excludes the delay period.

Changes in v2:
- Implement evsel__tool_pmu_enable() and evsel__tool_pmu_disable() to
avoid ioctl failures in batch evsel__enable() and evsel__disable()
functions.
- Correctly iterate and enable/disable tool PMU events configured as
non-leader members of event groups.
- Correct the lseek() arguments order in the read_stat helper:
lseek(fd, 0, SEEK_SET) instead of lseek(fd, SEEK_SET, 0).
- Introduce INVALID_START_TIME (~0ULL) to prevent erroneous large delta
accumulation in evsel__tool_pmu_read() if /proc/<pid>/stat fails to
read in enable_cpu (e.g., process exited).
- Improve test parsing to use LC_ALL=C and cut to be robust against
different locales, and use awk to dynamically compare duration_time to
time elapsed with a 200ms tolerance (avoiding loaded CI false failures).
Also added a lower-bound check.

Ian Rogers (2):
perf tool_pmu: Make tool PMU events respect enable/disable
perf tests: Add test for stat delay option with duration_time

tools/perf/tests/shell/stat.sh | 48 +++++++
tools/perf/util/evsel.c | 190 +++++++++++++++++++------
tools/perf/util/evsel.h | 10 +-
tools/perf/util/tool_pmu.c | 244 ++++++++++++++++++++++++++-------
tools/perf/util/tool_pmu.h | 4 +
5 files changed, 399 insertions(+), 97 deletions(-)

--
2.54.0.631.ge1b05301d1-goog