Re: [PATCH] tools/perf/test: Check for perf stat return code in perf all PMU test

Ian Rogers
2026-04-01T20:41:07Z

On Mon, Mar 23, 2026 at 3:40 AM Venkat <venkat88@linux.ibm.com> wrote:
>
>
>
> > On 15 Mar 2026, at 4:27 PM, Athira Rajeev <atrajeev@linux.ibm.com> wrote:
> >
> > Currently in "perf all PMU test", for "perf stat -e <event> true",
> > below checks are done:
> > - if return code is zero, look for "not supported" to decide pass
> > scenario
> > - check for "not supported" to ignore the event
> > - looks for "No permission to enable" to skip the event.
> > - If output has "Bad event name", fail the test.
> > - Use "Access to performance monitoring and observability operations is
> > limited." to ignore fail due to access limitations
> >
> > If we failed to see event and it is supported, retries with longer
> > workload "perf bench internals synthesize".
> > - Here if output has <event>, the test is a pass.
> >
> > Snippet of code check:
> > ```
> > output=$(perf stat -e "$p" perf bench internals synthesize 2>&1)
> > if echo "$output" | grep -q "$p"
> > ```
> > - if output doesn't have event printed in logs, considers it fail.
> >
> > But this results in false pass for events in some cases.
> > Example, if perf stat fails as below:
> >
> > # ./perf stat -e pmu/event/ true
> > event syntax error: 'pmu/event/'
> > \___ Bad event or PMU
> >
> > Unable to find PMU or event on a PMU of 'pmu'
> > Run 'perf list' for a list of valid events
> >
> > Usage: perf stat [<options>] [<command>]
> >
> > -e, --event <event> event selector. use 'perf list' to list available events
> > # echo $?
> > 129
> >
> > Since this has non-zero return code and doesn't have the
> > fail strings being checked in the test, it will enter check using
> > longer workload. and since the output fail log has event, it
> > declares test as "supported".
> >
> > Since all the fail strings can't be added in the check, update
> > the testcase to check return code before proceeding to longer
> > workload run.
> >
> > Another missing scenario is when system wide monitoring is supported
> > example:
> > # ./perf stat -e pmu/event/ true
> > Error:
> > No supported events found.
> > Unsupported event (pmu/event/H) in per-thread mode, enable system wide with '-a'.
> >
> > Update testcase to check with "perf stat -a -e $p" as well
> >
> > Signed-off-by: Athira Rajeev <atrajeev@linux.ibm.com>
> > ---
>
> Tested this patch.
>
>
> With this patch:
>
> Testing hv_24x7/CPM_ADJUNCT_INST/ -- perf stat failed with non-zero return code
> Testing hv_24x7/CPM_ADJUNCT_PCYC/ -- perf stat failed with non-zero return code
>
>
>
> Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>

Testing on an Intel Alderlake the test is now failing:
```
...
Testing offcore_requests_outstanding.l3_miss_demand_data_rd -- supported
Testing ocr.full_streaming_wr.any_response -- perf stat failed with
non-zero return code
Testing ocr.partial_streaming_wr.any_response -- perf stat failed with
non-zero return code
Testing ocr.streaming_wr.any_response -- supported
...
```

Running `perf stat` manually reveals an issue with the event:
```
$ sudo perf stat -vv -e ocr.full_streaming_wr.any_response -a sleep
1
Using CPUID GenuineIntel-6-B7-1
Attempt to add: cpu_atom/ocr.full_streaming_wr.any_response/
..after resolving event:
cpu_atom/event=0xb7,period=0x186a3,umask=0x1,offcore_rsp=0x800000010000/
ocr.full_streaming_wr.any_response ->
cpu_atom/ocr.full_streaming_wr.any_response/
Control descriptor is not initialized
------------------------------------------------------------
perf_event_attr:
type 10 (cpu_atom)
size 144
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0xa00000000
(cpu_atom/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8 = 3
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0x400000000
(cpu_core/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8 = 3
config 0x1b7
(ocr.demand_data_rd.l3_hit.snoop_hit_no_fwd)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
{ bp_addr, config1 } 0x800000010000
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 16 group_fd -1 flags 0x8
sys_perf_event_open failed, error -22
switching off deferred callchain support
Warning:
ocr.full_streaming_wr.any_response event is not supported by the kernel.
The sys_perf_event_open() syscall failed for event
(ocr.full_streaming_wr.any_response): Invalid argument
"dmesg | grep -i perf" may provide additional information.

Error:
No supported events found.
The sys_perf_event_open() syscall failed for event
(ocr.full_streaming_wr.any_response): Invalid argument
"dmesg | grep -i perf" may provide additional information.
```

This looks like a latent Intel cpu_atom PMU bug. Thomas, wdyt?

Thanks,
Ian

> Regards,
> Venkat.
>
>
>
> > tools/perf/tests/shell/stat_all_pmu.sh | 20 ++++++++++++++++++++
> > 1 file changed, 20 insertions(+)
> >
> > diff --git a/tools/perf/tests/shell/stat_all_pmu.sh b/tools/perf/tests/shell/stat_all_pmu.sh
> > index 9c466c0efa85..6c4d59cbfa5f 100755
> > --- a/tools/perf/tests/shell/stat_all_pmu.sh
> > +++ b/tools/perf/tests/shell/stat_all_pmu.sh
> > @@ -53,6 +53,26 @@ do
> > continue
> > fi
> >
> > + # check with system wide if it is supported.
> > + output=$(perf stat -a -e "$p" true 2>&1)
> > + stat_result=$?
> > + if echo "$output" | grep -q "not supported"
> > + then
> > + # Event not supported, so ignore.
> > + echo "not supported"
> > + continue
> > + fi
> > +
> > + # checked through possible access limitations and permissions.
> > + # At this step, non-zero return code from "perf stat" needs to
> > + # reported as fail for the user to investigate
> > + if [ $stat_result -ne 0 ]
> > + then
> > + echo "perf stat failed with non-zero return code"
> > + err=1
> > + continue
> > + fi
> > +
> > # We failed to see the event and it is supported. Possibly the workload was
> > # too small so retry with something longer.
> > output=$(perf stat -e "$p" perf bench internals synthesize 2>&1)
> > --
> > 2.47.3
> >
>