xref: /openbmc/linux/tools/perf/tests/shell/stat.sh (revision c0d68601)
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
3186698623SSandipan Dastest_stat_record_script() {
3286698623SSandipan Das  echo "stat record and script test"
3386698623SSandipan Das  if ! perf stat record -o - true | perf script -i - 2>&1 | \
3486698623SSandipan Das    grep -E -q "CPU[[:space:]]+THREAD[[:space:]]+VAL[[:space:]]+ENA[[:space:]]+RUN[[:space:]]+TIME[[:space:]]+EVENT"
3586698623SSandipan Das  then
3686698623SSandipan Das    echo "stat record and script test [Failed]"
3786698623SSandipan Das    err=1
3886698623SSandipan Das    return
3986698623SSandipan Das  fi
4086698623SSandipan Das  echo "stat record and script test [Success]"
4186698623SSandipan Das}
4286698623SSandipan 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
106*c0d68601SIan Rogerstest_cputype() {
107*c0d68601SIan Rogers  # Test --cputype argument.
108*c0d68601SIan Rogers  echo "cputype test"
109*c0d68601SIan Rogers
110*c0d68601SIan Rogers  # Bogus PMU should fail.
111*c0d68601SIan Rogers  if perf stat --cputype="123" -e instructions true > /dev/null 2>&1
112*c0d68601SIan Rogers  then
113*c0d68601SIan Rogers    echo "cputype test [Bogus PMU didn't fail]"
114*c0d68601SIan Rogers    err=1
115*c0d68601SIan Rogers    return
116*c0d68601SIan Rogers  fi
117*c0d68601SIan Rogers
118*c0d68601SIan Rogers  # Find a known PMU for cputype.
119*c0d68601SIan Rogers  pmu=""
120*c0d68601SIan Rogers  for i in cpu cpu_atom armv8_pmuv3_0
121*c0d68601SIan Rogers  do
122*c0d68601SIan Rogers    if test -d "/sys/devices/$i"
123*c0d68601SIan Rogers    then
124*c0d68601SIan Rogers      pmu="$i"
125*c0d68601SIan Rogers      break
126*c0d68601SIan Rogers    fi
127*c0d68601SIan Rogers    if perf stat -e "$i/instructions/" true > /dev/null 2>&1
128*c0d68601SIan Rogers    then
129*c0d68601SIan Rogers      pmu="$i"
130*c0d68601SIan Rogers      break
131*c0d68601SIan Rogers    fi
132*c0d68601SIan Rogers  done
133*c0d68601SIan Rogers  if test "x$pmu" = "x"
134*c0d68601SIan Rogers  then
135*c0d68601SIan Rogers    echo "cputype test [Skipped known PMU not found]"
136*c0d68601SIan Rogers    return
137*c0d68601SIan Rogers  fi
138*c0d68601SIan Rogers
139*c0d68601SIan Rogers  # Test running with cputype produces output.
140*c0d68601SIan Rogers  if ! perf stat --cputype="$pmu" -e instructions true 2>&1 | grep -E -q "instructions"
141*c0d68601SIan Rogers  then
142*c0d68601SIan Rogers    echo "cputype test [Failed count missed with given filter]"
143*c0d68601SIan Rogers    err=1
144*c0d68601SIan Rogers    return
145*c0d68601SIan Rogers  fi
146*c0d68601SIan Rogers  echo "cputype test [Success]"
147*c0d68601SIan Rogers}
148*c0d68601SIan Rogers
1496a973e29SIan Rogerstest_default_stat
1500dd9769fSIan Rogerstest_stat_record_report
15186698623SSandipan Dastest_stat_record_script
1520c361c6eSIan Rogerstest_stat_repeat_weak_groups
1536a973e29SIan Rogerstest_topdown_groups
1546a973e29SIan Rogerstest_topdown_weak_groups
155*c0d68601SIan Rogerstest_cputype
1566a973e29SIan Rogersexit $err
157