summaryrefslogtreecommitdiff
path: root/tools/perf/tests/shell/stat_all_metrics.sh
blob: df5fa27b21ae28d881caed79d213cbdbedf8efca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash
# perf all metrics test
# SPDX-License-Identifier: GPL-2.0

ParanoidAndNotRoot()
{
  [ "$(id -u)" != 0 ] && [ "$(cat /proc/sys/kernel/perf_event_paranoid)" -gt $1 ]
}

test_prog="true"
system_wide_flag="-a"
if ParanoidAndNotRoot 0
then
  system_wide_flag=""
  test_prog="perf test -w noploop 0.01"
fi

check_metric() {
  local output="$1"
  local status="$2"
  local metric="$3"

  if [[ $status -ne 0 || ! "$output" =~ ${metric:0:50} ]]; then
    return 1
  fi

  if [[ "$output" =~ "<not counted>" || "$output" =~ "<not supported>" ]]; then
    return 1
  fi

  return 0
}

skip=0
err=3
for m in $(perf list --raw-dump metrics); do
  echo "Testing $m"
  result=$(perf stat -M "$m" $system_wide_flag -- $test_prog 2>&1)
  result_err=$?

  if check_metric "$result" $result_err "$m"; then
    if [[ "$err" -ne 1 ]]
    then
      err=0
    fi
    continue
  fi

  if [[ "$result" =~ "Access to performance monitoring and observability operations is limited" || \
        "$result" =~ "in per-thread mode, enable system wide" || \
        "$result" =~ "<not supported>" || \
        "$result" =~ "Cannot resolve IDs for" || \
        "$result" =~ "No supported events found" || \
        "$result" =~ "FP_ARITH" || \
        "$result" =~ "AMX" || \
        "$result" =~ "PMM" ]]
  then
    true
  else
    result=$(perf stat -M "$m" $system_wide_flag -- perf test -w noploop 0.1 2>&1)
    result_err=$?

    if check_metric "$result" $result_err "$m"; then
      if [[ "$err" -ne 1 ]]
      then
        err=0
      fi
      continue
    fi
  fi

  # If retry also failed, determine if we skip, ignore, or fail
  if [[ "$result" =~ "Access to performance monitoring and observability operations is limited" ]]
  then
    echo "[Skipped $m] Permission failure"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  elif [[ "$result" =~ "in per-thread mode, enable system wide" ]]
  then
    echo "[Skipped $m] Permissions - need system wide mode"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  elif [[ "$result" =~ "<not supported>" || \
          "$result" =~ "Cannot resolve IDs for" || \
          "$result" =~ "No supported events found" ]]
  then
    if [[ $(perf list --raw-dump $m) == "Default"* ]]
    then
      echo "[Ignored $m] failed but as a Default metric this can be expected"
      echo $result
      continue
    fi
    echo "[Skipped $m] Not supported events"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  elif [[ "$result" =~ "<not counted>" ]]
  then
    echo "[Skipped $m] Not counted events"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  elif [[ "$result" =~ "FP_ARITH" || "$result" =~ "AMX" ]]
  then
    echo "[Skipped $m] FP issues"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  elif [[ "$result" =~ "PMM" ]]
  then
    echo "[Skipped $m] Optane memory issues"
    echo $result
    if [[ $err -eq 0 ]]
    then
      skip=1
    fi
    continue
  fi

  echo "[Failed $m] has non-zero error '$result_err' or not printed/counted in:"
  echo "$result"
  err=1
done

# return SKIP only if no success returned
if [[ "$err" -eq 3 && "$skip" -eq 1 ]]
then
  err=2
fi

exit "$err"