Loading...
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 |