1#!/bin/sh
2# perf stat tests
3# SPDX-License-Identifier: GPL-2.0
4
5set -e
6
7err=0
8test_default_stat() {
9  echo "Basic stat command test"
10  if ! perf stat true 2>&1 | grep -E -q "Performance counter stats for 'true':"
11  then
12    echo "Basic stat command test [Failed]"
13    err=1
14    return
15  fi
16  echo "Basic stat command test [Success]"
17}
18
19test_stat_record_report() {
20  echo "stat record and report test"
21  if ! perf stat record -o - true | perf stat report -i - 2>&1 | \
22    grep -E -q "Performance counter stats for 'pipe':"
23  then
24    echo "stat record and report test [Failed]"
25    err=1
26    return
27  fi
28  echo "stat record and report test [Success]"
29}
30
31test_stat_record_script() {
32  echo "stat record and script test"
33  if ! perf stat record -o - true | perf script -i - 2>&1 | \
34    grep -E -q "CPU[[:space:]]+THREAD[[:space:]]+VAL[[:space:]]+ENA[[:space:]]+RUN[[:space:]]+TIME[[:space:]]+EVENT"
35  then
36    echo "stat record and script test [Failed]"
37    err=1
38    return
39  fi
40  echo "stat record and script test [Success]"
41}
42
43test_stat_repeat_weak_groups() {
44  echo "stat repeat weak groups test"
45  if ! perf stat -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}' \
46     true 2>&1 | grep -q 'seconds time elapsed'
47  then
48    echo "stat repeat weak groups test [Skipped event parsing failed]"
49    return
50  fi
51  if ! perf stat -r2 -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}:W' \
52    true > /dev/null 2>&1
53  then
54    echo "stat repeat weak groups test [Failed]"
55    err=1
56    return
57  fi
58  echo "stat repeat weak groups test [Success]"
59}
60
61test_topdown_groups() {
62  # Topdown events must be grouped with the slots event first. Test that
63  # parse-events reorders this.
64  echo "Topdown event group test"
65  if ! perf stat -e '{slots,topdown-retiring}' true > /dev/null 2>&1
66  then
67    echo "Topdown event group test [Skipped event parsing failed]"
68    return
69  fi
70  if perf stat -e '{slots,topdown-retiring}' true 2>&1 | grep -E -q "<not supported>"
71  then
72    echo "Topdown event group test [Failed events not supported]"
73    err=1
74    return
75  fi
76  if perf stat -e '{topdown-retiring,slots}' true 2>&1 | grep -E -q "<not supported>"
77  then
78    echo "Topdown event group test [Failed slots not reordered first]"
79    err=1
80    return
81  fi
82  echo "Topdown event group test [Success]"
83}
84
85test_topdown_weak_groups() {
86  # Weak groups break if the perf_event_open of multiple grouped events
87  # fails. Breaking a topdown group causes the events to fail. Test a very large
88  # grouping to see that the topdown events aren't broken out.
89  echo "Topdown weak groups test"
90  ok_grouping="{slots,topdown-bad-spec,topdown-be-bound,topdown-fe-bound,topdown-retiring},branch-instructions,branch-misses,bus-cycles,cache-misses,cache-references,cpu-cycles,instructions,mem-loads,mem-stores,ref-cycles,cache-misses,cache-references"
91  if ! perf stat --no-merge -e "$ok_grouping" true > /dev/null 2>&1
92  then
93    echo "Topdown weak groups test [Skipped event parsing failed]"
94    return
95  fi
96  group_needs_break="{slots,topdown-bad-spec,topdown-be-bound,topdown-fe-bound,topdown-retiring,branch-instructions,branch-misses,bus-cycles,cache-misses,cache-references,cpu-cycles,instructions,mem-loads,mem-stores,ref-cycles,cache-misses,cache-references}:W"
97  if perf stat --no-merge -e "$group_needs_break" true 2>&1 | grep -E -q "<not supported>"
98  then
99    echo "Topdown weak groups test [Failed events not supported]"
100    err=1
101    return
102  fi
103  echo "Topdown weak groups test [Success]"
104}
105
106test_cputype() {
107  # Test --cputype argument.
108  echo "cputype test"
109
110  # Bogus PMU should fail.
111  if perf stat --cputype="123" -e instructions true > /dev/null 2>&1
112  then
113    echo "cputype test [Bogus PMU didn't fail]"
114    err=1
115    return
116  fi
117
118  # Find a known PMU for cputype.
119  pmu=""
120  for i in cpu cpu_atom armv8_pmuv3_0
121  do
122    if test -d "/sys/devices/$i"
123    then
124      pmu="$i"
125      break
126    fi
127    if perf stat -e "$i/instructions/" true > /dev/null 2>&1
128    then
129      pmu="$i"
130      break
131    fi
132  done
133  if test "x$pmu" = "x"
134  then
135    echo "cputype test [Skipped known PMU not found]"
136    return
137  fi
138
139  # Test running with cputype produces output.
140  if ! perf stat --cputype="$pmu" -e instructions true 2>&1 | grep -E -q "instructions"
141  then
142    echo "cputype test [Failed count missed with given filter]"
143    err=1
144    return
145  fi
146  echo "cputype test [Success]"
147}
148
149test_default_stat
150test_stat_record_report
151test_stat_record_script
152test_stat_repeat_weak_groups
153test_topdown_groups
154test_topdown_weak_groups
155test_cputype
156exit $err
157