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

Falcon, Thomas
2026-04-02T23:54:02Z

On Wed, 2026-04-01 at 13:40 -0700, Ian Rogers wrote:
> 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=0x8000000100
> 00/
> 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?

+Dapeng, Zide, Andi

Thanks,
Tom

>
> 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
> > >
> >