1- #! /bin/sh
1+ #! /bin/bash
22# Check branch stack sampling
33
44# SPDX-License-Identifier: GPL-2.0
1717
1818skip_test_missing_symbol brstack_bench
1919
20+ err=0
2021TMPDIR=$( mktemp -d /tmp/__perf_test.program.XXXXX)
2122TESTPROG=" perf test -w brstack"
2223
2324cleanup () {
2425 rm -rf $TMPDIR
26+ trap - EXIT TERM INT
2527}
2628
27- trap cleanup EXIT TERM INT
29+ trap_cleanup () {
30+ set +e
31+ echo " Unexpected signal in ${FUNCNAME[1]} "
32+ cleanup
33+ exit 1
34+ }
35+ trap trap_cleanup EXIT TERM INT
2836
2937test_user_branches () {
3038 echo " Testing user branch stack sampling"
3139
32- perf record -o $TMPDIR /perf.data --branch-filter any,save_type,u -- ${TESTPROG} > /dev/null 2>&1
33- perf script -i $TMPDIR /perf.data --fields brstacksym | tr -s ' ' ' \n ' > $TMPDIR /perf.script
40+ perf record -o " $TMPDIR /perf.data" --branch-filter any,save_type,u -- ${TESTPROG} > " $TMPDIR /record.txt " 2>&1
41+ perf script -i " $TMPDIR /perf.data" --fields brstacksym > " $TMPDIR /perf.script"
3442
3543 # example of branch entries:
3644 # brstack_foo+0x14/brstack_bar+0x40/P/-/-/0/CALL
3745
38- set -x
39- grep -E -m1 " ^brstack_bench\+[^ ]*/brstack_foo\+[^ ]*/IND_CALL/.*$" $TMPDIR /perf.script
40- grep -E -m1 " ^brstack_foo\+[^ ]*/brstack_bar\+[^ ]*/CALL/.*$" $TMPDIR /perf.script
41- grep -E -m1 " ^brstack_bench\+[^ ]*/brstack_foo\+[^ ]*/CALL/.*$" $TMPDIR /perf.script
42- grep -E -m1 " ^brstack_bench\+[^ ]*/brstack_bar\+[^ ]*/CALL/.*$" $TMPDIR /perf.script
43- grep -E -m1 " ^brstack_bar\+[^ ]*/brstack_foo\+[^ ]*/RET/.*$" $TMPDIR /perf.script
44- grep -E -m1 " ^brstack_foo\+[^ ]*/brstack_bench\+[^ ]*/RET/.*$" $TMPDIR /perf.script
45- grep -E -m1 " ^brstack_bench\+[^ ]*/brstack_bench\+[^ ]*/COND/.*$" $TMPDIR /perf.script
46- grep -E -m1 " ^brstack\+[^ ]*/brstack\+[^ ]*/UNCOND/.*$" $TMPDIR /perf.script
47- set +x
48-
46+ expected=(
47+ " ^brstack_bench\+[^ ]*/brstack_foo\+[^ ]*/IND_CALL/.*$"
48+ " ^brstack_foo\+[^ ]*/brstack_bar\+[^ ]*/CALL/.*$"
49+ " ^brstack_bench\+[^ ]*/brstack_foo\+[^ ]*/CALL/.*$"
50+ " ^brstack_bench\+[^ ]*/brstack_bar\+[^ ]*/CALL/.*$"
51+ " ^brstack_bar\+[^ ]*/brstack_foo\+[^ ]*/RET/.*$"
52+ " ^brstack_foo\+[^ ]*/brstack_bench\+[^ ]*/RET/.*$"
53+ " ^brstack_bench\+[^ ]*/brstack_bench\+[^ ]*/COND/.*$"
54+ " ^brstack\+[^ ]*/brstack\+[^ ]*/UNCOND/.*$"
55+ )
56+ for x in " ${expected[@]} "
57+ do
58+ if ! tr -s ' ' ' \n' < " $TMPDIR /perf.script" | grep -E -m1 -q " $x "
59+ then
60+ echo " Branches missing $x "
61+ err=1
62+ fi
63+ done
4964 # some branch types are still not being tested:
5065 # IND COND_CALL COND_RET SYSCALL SYSRET IRQ SERROR NO_TX
5166}
@@ -57,14 +72,28 @@ test_filter() {
5772 test_filter_expect=$2
5873
5974 echo " Testing branch stack filtering permutation ($test_filter_filter ,$test_filter_expect )"
60-
61- perf record -o $TMPDIR /perf.data --branch-filter $test_filter_filter ,save_type,u -- ${TESTPROG} > /dev/null 2>&1
62- perf script -i $TMPDIR /perf.data --fields brstack | tr -s ' ' ' \n' | grep ' .' > $TMPDIR /perf.script
75+ perf record -o " $TMPDIR /perf.data" --branch-filter " $test_filter_filter ,save_type,u" -- ${TESTPROG} > " $TMPDIR /record.txt" 2>&1
76+ perf script -i " $TMPDIR /perf.data" --fields brstack > " $TMPDIR /perf.script"
6377
6478 # fail if we find any branch type that doesn't match any of the expected ones
6579 # also consider UNKNOWN branch types (-)
66- if grep -E -vm1 " ^[^ ]*/($test_filter_expect |-|( *))/.*$" $TMPDIR /perf.script; then
67- return 1
80+ if [ ! -s " $TMPDIR /perf.script" ]
81+ then
82+ echo " Empty script output"
83+ err=1
84+ return
85+ fi
86+ # Look for lines not matching test_filter_expect ignoring issues caused
87+ # by empty output
88+ tr -s ' ' ' \n' < " $TMPDIR /perf.script" | grep ' .' | \
89+ grep -E -vm1 " ^[^ ]*/($test_filter_expect |-|( *))/.*$" \
90+ > " $TMPDIR /perf.script-filtered" || true
91+ if [ -s " $TMPDIR /perf.script-filtered" ]
92+ then
93+ echo " Unexpected branch filter in script output"
94+ cat " $TMPDIR /perf.script"
95+ err=1
96+ return
6897 fi
6998}
7099
@@ -80,3 +109,6 @@ test_filter "any_ret" "RET|COND_RET|SYSRET|ERET"
80109test_filter " call,cond" " CALL|SYSCALL|COND"
81110test_filter " any_call,cond" " CALL|IND_CALL|COND_CALL|IRQ|SYSCALL|COND"
82111test_filter " cond,any_call,any_ret" " COND|CALL|IND_CALL|COND_CALL|SYSCALL|IRQ|RET|COND_RET|SYSRET|ERET"
112+
113+ cleanup
114+ exit $err
0 commit comments