124bf6360a
perf data symbol test depends on finding symbol buf1 in perf, and fails if perf has been stripped and no debug object is available. In that case, skip the test instead. Example: Before: $ strip tools/perf/perf $ tools/perf/perf buildid-cache -p `realpath tools/perf/perf` $ tools/perf/perf test -v 'data symbol' 113: Test data symbol : --- start --- test child forked, pid 125646 Recording workload... [ perf record: Woken up 3 times to write data ] [ perf record: Captured and wrote 0.577 MB /tmp/__perf_test.perf.data.Jhbdp (7794 samples) ] Cleaning up files... test child finished with -1 ---- end ---- Test data symbol: FAILED! After: $ tools/perf/perf test -v 'data symbol' 113: Test data symbol : --- start --- test child forked, pid 125747 perf does not have symbol 'buf1' perf is missing symbols - skipping test test child finished with -2 ---- end ---- Test data symbol: Skip Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Ian Rogers <irogers@google.com> Cc: German Gomez <german.gomez@arm.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Leo Yan <leo.yan@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20231123075848.9652-9-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
79 lines
1.8 KiB
Bash
Executable File
79 lines
1.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Test data symbol
|
|
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Leo Yan <leo.yan@linaro.org>, 2022
|
|
|
|
shelldir=$(dirname "$0")
|
|
# shellcheck source=lib/waiting.sh
|
|
. "${shelldir}"/lib/waiting.sh
|
|
|
|
# shellcheck source=lib/perf_has_symbol.sh
|
|
. "${shelldir}"/lib/perf_has_symbol.sh
|
|
|
|
skip_if_no_mem_event() {
|
|
perf mem record -e list 2>&1 | grep -E -q 'available' && return 0
|
|
return 2
|
|
}
|
|
|
|
skip_if_no_mem_event || exit 2
|
|
|
|
skip_test_missing_symbol buf1
|
|
|
|
TEST_PROGRAM="perf test -w datasym"
|
|
PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
|
|
ERR_FILE=$(mktemp /tmp/__perf_test.stderr.XXXXX)
|
|
|
|
check_result() {
|
|
# The memory report format is as below:
|
|
# 99.92% ... [.] buf1+0x38
|
|
result=$(perf mem report -i ${PERF_DATA} -s symbol_daddr -q 2>&1 |
|
|
awk '/buf1/ { print $4 }')
|
|
|
|
# Testing is failed if has no any sample for "buf1"
|
|
[ -z "$result" ] && return 1
|
|
|
|
while IFS= read -r line; do
|
|
# The "data1" and "data2" fields in structure "buf1" have
|
|
# offset "0x0" and "0x38", returns failure if detect any
|
|
# other offset value.
|
|
if [ "$line" != "buf1+0x0" ] && [ "$line" != "buf1+0x38" ]; then
|
|
return 1
|
|
fi
|
|
done <<< "$result"
|
|
|
|
return 0
|
|
}
|
|
|
|
cleanup_files()
|
|
{
|
|
echo "Cleaning up files..."
|
|
rm -f ${PERF_DATA}
|
|
}
|
|
|
|
trap cleanup_files exit term int
|
|
|
|
echo "Recording workload..."
|
|
|
|
# perf mem/c2c internally uses IBS PMU on AMD CPU which doesn't support
|
|
# user/kernel filtering and per-process monitoring, spin program on
|
|
# specific CPU and test in per-CPU mode.
|
|
is_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo)
|
|
if (($is_amd >= 1)); then
|
|
perf mem record -vvv -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM 2>"${ERR_FILE}" &
|
|
else
|
|
perf mem record -vvv --all-user -o ${PERF_DATA} -- $TEST_PROGRAM 2>"${ERR_FILE}" &
|
|
fi
|
|
|
|
PERFPID=$!
|
|
|
|
wait_for_perf_to_start ${PERFPID} "${ERR_FILE}"
|
|
|
|
sleep 1
|
|
|
|
kill $PERFPID
|
|
wait $PERFPID
|
|
|
|
check_result
|
|
exit $?
|