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 149 150 151 152 153 154 155 156
|
#!/bin/sh
# perf stat tests
# SPDX-License-Identifier: GPL-2.0
set -e
err=0
test_default_stat() {
echo "Basic stat command test"
if ! perf stat true 2>&1 | grep -E -q "Performance counter stats for 'true':"
then
echo "Basic stat command test [Failed]"
err=1
return
fi
echo "Basic stat command test [Success]"
}
test_stat_record_report() {
echo "stat record and report test"
if ! perf stat record -o - true | perf stat report -i - 2>&1 | \
grep -E -q "Performance counter stats for 'pipe':"
then
echo "stat record and report test [Failed]"
err=1
return
fi
echo "stat record and report test [Success]"
}
test_stat_record_script() {
echo "stat record and script test"
if ! perf stat record -o - true | perf script -i - 2>&1 | \
grep -E -q "CPU[[:space:]]+THREAD[[:space:]]+VAL[[:space:]]+ENA[[:space:]]+RUN[[:space:]]+TIME[[:space:]]+EVENT"
then
echo "stat record and script test [Failed]"
err=1
return
fi
echo "stat record and script test [Success]"
}
test_stat_repeat_weak_groups() {
echo "stat repeat weak groups test"
if ! perf stat -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}' \
true 2>&1 | grep -q 'seconds time elapsed'
then
echo "stat repeat weak groups test [Skipped event parsing failed]"
return
fi
if ! perf stat -r2 -e '{cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles,cycles}:W' \
true > /dev/null 2>&1
then
echo "stat repeat weak groups test [Failed]"
err=1
return
fi
echo "stat repeat weak groups test [Success]"
}
test_topdown_groups() {
# Topdown events must be grouped with the slots event first. Test that
# parse-events reorders this.
echo "Topdown event group test"
if ! perf stat -e '{slots,topdown-retiring}' true > /dev/null 2>&1
then
echo "Topdown event group test [Skipped event parsing failed]"
return
fi
if perf stat -e '{slots,topdown-retiring}' true 2>&1 | grep -E -q "<not supported>"
then
echo "Topdown event group test [Failed events not supported]"
err=1
return
fi
if perf stat -e '{topdown-retiring,slots}' true 2>&1 | grep -E -q "<not supported>"
then
echo "Topdown event group test [Failed slots not reordered first]"
err=1
return
fi
echo "Topdown event group test [Success]"
}
test_topdown_weak_groups() {
# Weak groups break if the perf_event_open of multiple grouped events
# fails. Breaking a topdown group causes the events to fail. Test a very large
# grouping to see that the topdown events aren't broken out.
echo "Topdown weak groups test"
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"
if ! perf stat --no-merge -e "$ok_grouping" true > /dev/null 2>&1
then
echo "Topdown weak groups test [Skipped event parsing failed]"
return
fi
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"
if perf stat --no-merge -e "$group_needs_break" true 2>&1 | grep -E -q "<not supported>"
then
echo "Topdown weak groups test [Failed events not supported]"
err=1
return
fi
echo "Topdown weak groups test [Success]"
}
test_cputype() {
# Test --cputype argument.
echo "cputype test"
# Bogus PMU should fail.
if perf stat --cputype="123" -e instructions true > /dev/null 2>&1
then
echo "cputype test [Bogus PMU didn't fail]"
err=1
return
fi
# Find a known PMU for cputype.
pmu=""
for i in cpu cpu_atom armv8_pmuv3_0
do
if test -d "/sys/devices/$i"
then
pmu="$i"
break
fi
if perf stat -e "$i/instructions/" true > /dev/null 2>&1
then
pmu="$i"
break
fi
done
if test "x$pmu" = "x"
then
echo "cputype test [Skipped known PMU not found]"
return
fi
# Test running with cputype produces output.
if ! perf stat --cputype="$pmu" -e instructions true 2>&1 | grep -E -q "instructions"
then
echo "cputype test [Failed count missed with given filter]"
err=1
return
fi
echo "cputype test [Success]"
}
test_default_stat
test_stat_record_report
test_stat_record_script
test_stat_repeat_weak_groups
test_topdown_groups
test_topdown_weak_groups
test_cputype
exit $err
|