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