1#!/bin/bash
2# perf all metrics test
3# SPDX-License-Identifier: GPL-2.0
4
5ParanoidAndNotRoot()
6{
7  [ "$(id -u)" != 0 ] && [ "$(cat /proc/sys/kernel/perf_event_paranoid)" -gt $1 ]
8}
9
10test_prog="sleep 0.01"
11system_wide_flag="-a"
12if ParanoidAndNotRoot 0
13then
14  system_wide_flag=""
15  test_prog="perf test -w noploop"
16fi
17
18err=0
19for m in $(perf list --raw-dump metrics); do
20  echo "Testing $m"
21  result=$(perf stat -M "$m" $system_wide_flag -- $test_prog 2>&1)
22  result_err=$?
23  if [[ $result_err -eq 0 && "$result" =~ ${m:0:50} ]]
24  then
25    # No error result and metric shown.
26    continue
27  fi
28  if [[ "$result" =~ "Cannot resolve IDs for" ]]
29  then
30    echo "Metric contains missing events"
31    echo $result
32    err=1 # Fail
33    continue
34  elif [[ "$result" =~ \
35        "Access to performance monitoring and observability operations is limited" ]]
36  then
37    echo "Permission failure"
38    echo $result
39    if [[ $err -eq 0 ]]
40    then
41      err=2 # Skip
42    fi
43    continue
44  elif [[ "$result" =~ "in per-thread mode, enable system wide" ]]
45  then
46    echo "Permissions - need system wide mode"
47    echo $result
48    if [[ $err -eq 0 ]]
49    then
50      err=2 # Skip
51    fi
52    continue
53  elif [[ "$result" =~ "<not supported>" ]]
54  then
55    echo "Not supported events"
56    echo $result
57    if [[ $err -eq 0 ]]
58    then
59      err=2 # Skip
60    fi
61    continue
62  elif [[ "$result" =~ "<not counted>" ]]
63  then
64    echo "Not counted events"
65    echo $result
66    if [[ $err -eq 0 ]]
67    then
68      err=2 # Skip
69    fi
70    continue
71  elif [[ "$result" =~ "FP_ARITH" || "$result" =~ "AMX" ]]
72  then
73    echo "FP issues"
74    echo $result
75    if [[ $err -eq 0 ]]
76    then
77      err=2 # Skip
78    fi
79    continue
80  elif [[ "$result" =~ "PMM" ]]
81  then
82    echo "Optane memory issues"
83    echo $result
84    if [[ $err -eq 0 ]]
85    then
86      err=2 # Skip
87    fi
88    continue
89  fi
90
91  # Failed, possibly the workload was too small so retry with something longer.
92  result=$(perf stat -M "$m" $system_wide_flag -- perf bench internals synthesize 2>&1)
93  result_err=$?
94  if [[ $result_err -eq 0 && "$result" =~ ${m:0:50} ]]
95  then
96    # No error result and metric shown.
97    continue
98  fi
99  echo "Metric '$m' has non-zero error '$result_err' or not printed in:"
100  echo "$result"
101  err=1
102done
103
104exit "$err"
105