2022-04-13 18:46:42 -07:00
#!/bin/sh
# perf record tests
# SPDX-License-Identifier: GPL-2.0
set -e
2022-10-20 10:26:39 -07:00
shelldir = $( dirname " $0 " )
. " ${ shelldir } " /lib/waiting.sh
2022-04-13 18:46:42 -07:00
err = 0
2022-05-05 11:25:05 -07:00
perfdata = $( mktemp /tmp/__perf_test.perf.data.XXXXX)
2022-11-16 15:38:46 -08:00
testprog = "perf test -w thloop"
2022-10-20 10:26:38 -07:00
testsym = "test_loop"
2022-05-05 11:25:05 -07:00
cleanup( ) {
2022-10-20 10:26:42 -07:00
rm -rf " ${ perfdata } "
rm -rf " ${ perfdata } " .old
2022-10-20 10:26:38 -07:00
2022-10-20 10:26:37 -07:00
trap - EXIT TERM INT
2022-05-05 11:25:05 -07:00
}
trap_cleanup( ) {
cleanup
exit 1
}
2022-10-20 10:26:37 -07:00
trap trap_cleanup EXIT TERM INT
2022-05-05 11:25:05 -07:00
2022-04-13 18:46:42 -07:00
test_per_thread( ) {
echo "Basic --per-thread mode test"
2022-10-20 10:26:38 -07:00
if ! perf record -o /dev/null --quiet ${ testprog } 2> /dev/null
2022-05-05 11:25:05 -07:00
then
2022-10-20 10:26:36 -07:00
echo "Per-thread record [Skipped event not supported]"
2022-05-05 11:25:05 -07:00
return
fi
2022-10-20 10:26:38 -07:00
if ! perf record --per-thread -o " ${ perfdata } " ${ testprog } 2> /dev/null
2022-05-05 11:25:05 -07:00
then
2022-10-20 10:26:36 -07:00
echo "Per-thread record [Failed record]"
2022-05-05 11:25:05 -07:00
err = 1
return
fi
2022-10-20 10:26:38 -07:00
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
2022-05-05 11:25:05 -07:00
then
echo "Per-thread record [Failed missing output]"
err = 1
return
fi
2022-10-20 10:26:39 -07:00
2022-11-16 15:38:46 -08:00
# run the test program in background (for 30 seconds)
${ testprog } 30 &
2022-10-20 10:26:39 -07:00
TESTPID = $!
rm -f " ${ perfdata } "
wait_for_threads ${ TESTPID } 2
perf record -p " ${ TESTPID } " --per-thread -o " ${ perfdata } " sleep 1 2> /dev/null
kill ${ TESTPID }
if [ ! -e " ${ perfdata } " ]
then
echo "Per-thread record [Failed record -p]"
err = 1
return
fi
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
then
echo "Per-thread record [Failed -p missing output]"
err = 1
return
fi
2022-04-13 18:46:42 -07:00
echo "Basic --per-thread mode test [Success]"
}
test_register_capture( ) {
echo "Register capture test"
2022-10-20 10:26:37 -07:00
if ! perf list | grep -q 'br_inst_retired.near_call'
2022-04-13 18:46:42 -07:00
then
2022-10-20 10:26:36 -07:00
echo "Register capture test [Skipped missing event]"
2022-04-13 18:46:42 -07:00
return
fi
2022-10-20 10:26:37 -07:00
if ! perf record --intr-regs= \? 2>& 1 | grep -q 'available registers: AX BX CX DX SI DI BP SP IP FLAGS CS SS R8 R9 R10 R11 R12 R13 R14 R15'
2022-04-13 18:46:42 -07:00
then
echo "Register capture test [Skipped missing registers]"
return
fi
2022-11-22 09:31:21 +01:00
if ! perf record -o - --intr-regs= di,r8,dx,cx -e br_inst_retired.near_call \
2022-10-20 10:26:38 -07:00
-c 1000 --per-thread ${ testprog } 2> /dev/null \
2022-04-13 18:46:42 -07:00
| perf script -F ip,sym,iregs -i - 2> /dev/null \
2022-10-20 10:26:37 -07:00
| grep -q "DI:"
2022-04-13 18:46:42 -07:00
then
echo "Register capture test [Failed missing output]"
err = 1
return
fi
echo "Register capture test [Success]"
}
2022-10-20 10:26:40 -07:00
test_system_wide( ) {
echo "Basic --system-wide mode test"
if ! perf record -aB --synth= no -o " ${ perfdata } " ${ testprog } 2> /dev/null
then
echo "System-wide record [Skipped not supported]"
return
fi
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
then
echo "System-wide record [Failed missing output]"
err = 1
return
fi
2022-10-20 10:26:42 -07:00
if ! perf record -aB --synth= no -e cpu-clock,cs --threads= cpu \
-o " ${ perfdata } " ${ testprog } 2> /dev/null
then
echo "System-wide record [Failed record --threads option]"
err = 1
return
fi
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
then
echo "System-wide record [Failed --threads missing output]"
err = 1
return
fi
2022-10-20 10:26:40 -07:00
echo "Basic --system-wide mode test [Success]"
}
2022-10-20 10:26:41 -07:00
test_workload( ) {
echo "Basic target workload test"
if ! perf record -o " ${ perfdata } " ${ testprog } 2> /dev/null
then
echo "Workload record [Failed record]"
err = 1
return
fi
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
then
echo "Workload record [Failed missing output]"
err = 1
return
fi
2022-10-20 10:26:42 -07:00
if ! perf record -e cpu-clock,cs --threads= package \
-o " ${ perfdata } " ${ testprog } 2> /dev/null
then
echo "Workload record [Failed record --threads option]"
err = 1
return
fi
if ! perf report -i " ${ perfdata } " -q | grep -q " ${ testsym } "
then
echo "Workload record [Failed --threads missing output]"
err = 1
return
fi
2022-10-20 10:26:41 -07:00
echo "Basic target workload test [Success]"
}
2022-04-13 18:46:42 -07:00
test_per_thread
test_register_capture
2022-10-20 10:26:40 -07:00
test_system_wide
2022-10-20 10:26:41 -07:00
test_workload
2022-05-05 11:25:05 -07:00
cleanup
2022-04-13 18:46:42 -07:00
exit $err