xref: /openbmc/linux/tools/perf/tests/shell/stat.sh (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
16a973e29SIan Rogers#!/bin/sh
26a973e29SIan Rogers# perf stat tests
36a973e29SIan Rogers# SPDX-License-Identifier: GPL-2.0
46a973e29SIan Rogers
56a973e29SIan Rogersset -e
66a973e29SIan Rogers
76a973e29SIan Rogerserr=0
86a973e29SIan Rogerstest_default_stat() {
96a973e29SIan Rogers  echo "Basic stat command test"
10818448e9STiezhu Yang  if ! perf stat true 2>&1 | grep -E -q "Performance counter stats for 'true':"
116a973e29SIan Rogers  then
126a973e29SIan Rogers    echo "Basic stat command test [Failed]"
136a973e29SIan Rogers    err=1
146a973e29SIan Rogers    return
156a973e29SIan Rogers  fi
166a973e29SIan Rogers  echo "Basic stat command test [Success]"
176a973e29SIan Rogers}
186a973e29SIan Rogers
190dd9769fSIan Rogerstest_stat_record_report() {
200dd9769fSIan Rogers  echo "stat record and report test"
210dd9769fSIan Rogers  if ! perf stat record -o - true | perf stat report -i - 2>&1 | \
22818448e9STiezhu Yang    grep -E -q "Performance counter stats for 'pipe':"
230dd9769fSIan Rogers  then
240dd9769fSIan Rogers    echo "stat record and report test [Failed]"
250dd9769fSIan Rogers    err=1
260dd9769fSIan Rogers    return
270dd9769fSIan Rogers  fi
280dd9769fSIan Rogers  echo "stat record and report test [Success]"
290dd9769fSIan Rogers}
300dd9769fSIan Rogers
31*86698623SSandipan Dastest_stat_record_script() {
32*86698623SSandipan Das  echo "stat record and script test"
33*86698623SSandipan Das  if ! perf stat record -o - true | perf script -i - 2>&1 | \
34*86698623SSandipan Das    grep -E -q "CPU[[:space:]]+THREAD[[:space:]]+VAL[[:space:]]+ENA[[:space:]]+RUN[[:space:]]+TIME[[:space:]]+EVENT"
35*86698623SSandipan Das  then
36*86698623SSandipan Das    echo "stat record and script test [Failed]"
37*86698623SSandipan Das    err=1
38*86698623SSandipan Das    return
39*86698623SSandipan Das  fi
40*86698623SSandipan Das  echo "stat record and script test [Success]"
41*86698623SSandipan Das}
42*86698623SSandipan Das
430c361c6eSIan Rogerstest_stat_repeat_weak_groups() {
440c361c6eSIan Rogers  echo "stat repeat weak groups test"
450c361c6eSIan Rogers  if ! perf stat -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}' \
460c361c6eSIan Rogers     true 2>&1 | grep -q 'seconds time elapsed'
470c361c6eSIan Rogers  then
480c361c6eSIan Rogers    echo "stat repeat weak groups test [Skipped event parsing failed]"
490c361c6eSIan Rogers    return
500c361c6eSIan Rogers  fi
510c361c6eSIan Rogers  if ! perf stat -r2 -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}:W' \
520c361c6eSIan Rogers    true > /dev/null 2>&1
530c361c6eSIan Rogers  then
540c361c6eSIan Rogers    echo "stat repeat weak groups test [Failed]"
550c361c6eSIan Rogers    err=1
560c361c6eSIan Rogers    return
570c361c6eSIan Rogers  fi
580c361c6eSIan Rogers  echo "stat repeat weak groups test [Success]"
590c361c6eSIan Rogers}
600c361c6eSIan Rogers
616a973e29SIan Rogerstest_topdown_groups() {
626a973e29SIan Rogers  # Topdown events must be grouped with the slots event first. Test that
636a973e29SIan Rogers  # parse-events reorders this.
646a973e29SIan Rogers  echo "Topdown event group test"
656a973e29SIan Rogers  if ! perf stat -e '{slots,topdown-retiring}' true > /dev/null 2>&1
666a973e29SIan Rogers  then
676a973e29SIan Rogers    echo "Topdown event group test [Skipped event parsing failed]"
686a973e29SIan Rogers    return
696a973e29SIan Rogers  fi
70818448e9STiezhu Yang  if perf stat -e '{slots,topdown-retiring}' true 2>&1 | grep -E -q "<not supported>"
716a973e29SIan Rogers  then
726a973e29SIan Rogers    echo "Topdown event group test [Failed events not supported]"
736a973e29SIan Rogers    err=1
746a973e29SIan Rogers    return
756a973e29SIan Rogers  fi
76818448e9STiezhu Yang  if perf stat -e '{topdown-retiring,slots}' true 2>&1 | grep -E -q "<not supported>"
776a973e29SIan Rogers  then
786a973e29SIan Rogers    echo "Topdown event group test [Failed slots not reordered first]"
796a973e29SIan Rogers    err=1
806a973e29SIan Rogers    return
816a973e29SIan Rogers  fi
826a973e29SIan Rogers  echo "Topdown event group test [Success]"
836a973e29SIan Rogers}
846a973e29SIan Rogers
856a973e29SIan Rogerstest_topdown_weak_groups() {
866a973e29SIan Rogers  # Weak groups break if the perf_event_open of multiple grouped events
876a973e29SIan Rogers  # fails. Breaking a topdown group causes the events to fail. Test a very large
886a973e29SIan Rogers  # grouping to see that the topdown events aren't broken out.
896a973e29SIan Rogers  echo "Topdown weak groups test"
906a973e29SIan Rogers  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"
916a973e29SIan Rogers  if ! perf stat --no-merge -e "$ok_grouping" true > /dev/null 2>&1
926a973e29SIan Rogers  then
936a973e29SIan Rogers    echo "Topdown weak groups test [Skipped event parsing failed]"
946a973e29SIan Rogers    return
956a973e29SIan Rogers  fi
966a973e29SIan Rogers  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"
97818448e9STiezhu Yang  if perf stat --no-merge -e "$group_needs_break" true 2>&1 | grep -E -q "<not supported>"
986a973e29SIan Rogers  then
996a973e29SIan Rogers    echo "Topdown weak groups test [Failed events not supported]"
1006a973e29SIan Rogers    err=1
1016a973e29SIan Rogers    return
1026a973e29SIan Rogers  fi
1036a973e29SIan Rogers  echo "Topdown weak groups test [Success]"
1046a973e29SIan Rogers}
1056a973e29SIan Rogers
1066a973e29SIan Rogerstest_cputype() {
1070dd9769fSIan Rogers  # Test --cputype argument.
108*86698623SSandipan Das  echo "cputype test"
1090c361c6eSIan Rogers
1106a973e29SIan Rogers  # Bogus PMU should fail.
1116a973e29SIan Rogers  if perf stat --cputype="123" -e instructions true > /dev/null 2>&1
1126a973e29SIan Rogers  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