2e9f5bda2f
Using precise flag with br_inst_retired.near_call causes the test fail on KVM guests, even when the guests have PMU forwarding enabled and the event itself is supported. Remove the precise flag in order to make the test work on KVM guests. Signed-off-by: Michael Petlan <mpetlan@redhat.com> Acked-by: Ian Rogers <irogers@google.com> Link: https://lore.kernel.org/r/20221122083121.6012-1-mpetlan@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
164 lines
3.7 KiB
Bash
Executable File
164 lines
3.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# perf record tests
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
set -e
|
|
|
|
shelldir=$(dirname "$0")
|
|
. "${shelldir}"/lib/waiting.sh
|
|
|
|
err=0
|
|
perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
|
|
testprog="perf test -w thloop"
|
|
testsym="test_loop"
|
|
|
|
cleanup() {
|
|
rm -rf "${perfdata}"
|
|
rm -rf "${perfdata}".old
|
|
|
|
trap - EXIT TERM INT
|
|
}
|
|
|
|
trap_cleanup() {
|
|
cleanup
|
|
exit 1
|
|
}
|
|
trap trap_cleanup EXIT TERM INT
|
|
|
|
test_per_thread() {
|
|
echo "Basic --per-thread mode test"
|
|
if ! perf record -o /dev/null --quiet ${testprog} 2> /dev/null
|
|
then
|
|
echo "Per-thread record [Skipped event not supported]"
|
|
return
|
|
fi
|
|
if ! perf record --per-thread -o "${perfdata}" ${testprog} 2> /dev/null
|
|
then
|
|
echo "Per-thread record [Failed record]"
|
|
err=1
|
|
return
|
|
fi
|
|
if ! perf report -i "${perfdata}" -q | grep -q "${testsym}"
|
|
then
|
|
echo "Per-thread record [Failed missing output]"
|
|
err=1
|
|
return
|
|
fi
|
|
|
|
# run the test program in background (for 30 seconds)
|
|
${testprog} 30 &
|
|
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
|
|
|
|
echo "Basic --per-thread mode test [Success]"
|
|
}
|
|
|
|
test_register_capture() {
|
|
echo "Register capture test"
|
|
if ! perf list | grep -q 'br_inst_retired.near_call'
|
|
then
|
|
echo "Register capture test [Skipped missing event]"
|
|
return
|
|
fi
|
|
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'
|
|
then
|
|
echo "Register capture test [Skipped missing registers]"
|
|
return
|
|
fi
|
|
if ! perf record -o - --intr-regs=di,r8,dx,cx -e br_inst_retired.near_call \
|
|
-c 1000 --per-thread ${testprog} 2> /dev/null \
|
|
| perf script -F ip,sym,iregs -i - 2> /dev/null \
|
|
| grep -q "DI:"
|
|
then
|
|
echo "Register capture test [Failed missing output]"
|
|
err=1
|
|
return
|
|
fi
|
|
echo "Register capture test [Success]"
|
|
}
|
|
|
|
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
|
|
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
|
|
echo "Basic --system-wide mode test [Success]"
|
|
}
|
|
|
|
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
|
|
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
|
|
echo "Basic target workload test [Success]"
|
|
}
|
|
|
|
test_per_thread
|
|
test_register_capture
|
|
test_system_wide
|
|
test_workload
|
|
|
|
cleanup
|
|
exit $err
|