mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Leak sanitizer will report memory leaks from python and the leak sanitizer output causes tests to fail. For example: ``` $ perf test 98 -v 98: perf script tests: --- start --- test child forked, pid 1272962 DB test [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.046 MB /tmp/perf-test-script.x0EktdCel8/perf.data (8 samples) ] call_path_table((1, 0, 0, 0) call_path_table((2, 1, 0, 140339508617447) call_path_table((3, 2, 2, 0) call_path_table((4, 3, 3, 0) call_path_table((5, 4, 4, 0) call_path_table((6, 5, 5, 0) call_path_table((7, 6, 6, 0) call_path_table((8, 7, 7, 0) call_path_table((9, 8, 8, 0) call_path_table((10, 9, 9, 0) call_path_table((11, 10, 10, 0) call_path_table((12, 11, 11, 0) call_path_table((13, 12, 1, 0) sample_table((1, 1, 1, 1, 1, 1, 1, 8, -2058824120, 588306954119000, -1, 0, 0, 0, 0, 1, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) sample_table((2, 1, 1, 1, 1, 1, 1, 8, -2058824120, 588306954137053, -1, 0, 0, 0, 0, 1, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) sample_table((3, 1, 1, 1, 1, 1, 1, 8, -2058824120, 588306954140089, -1, 0, 0, 0, 0, 9, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) sample_table((4, 1, 1, 1, 1, 1, 1, 8, -2058824120, 588306954142376, -1, 0, 0, 0, 0, 155, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) sample_table((5, 1, 1, 1, 1, 1, 1, 8, -2058824120, 588306954144045, -1, 0, 0, 0, 0, 2493, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) sample_table((6, 1, 1, 1, 1, 1, 12, 77, -2046828595, 588306954145722, -1, 0, 0, 0, 0, 47555, 0, 0, 128933429281, 0, 0, 13, 0, 0, 0, -1, -1)) call_path_table((14, 9, 14, 0) call_path_table((15, 14, 15, 0) call_path_table((16, 15, 0, -1040969624) call_path_table((17, 16, 16, 0) call_path_table((18, 17, 17, 0) call_path_table((19, 18, 18, 0) call_path_table((20, 19, 19, 0) call_path_table((21, 20, 13, 0) sample_table((7, 1, 1, 1, 2, 1, 13, 46, -2053700898, 588306954157436, -1, 0, 0, 0, 0, 964078, 0, 0, 128933429281, 0, 0, 21, 0, 0, 0, -1, -1)) call_path_table((22, 1, 21, 0) call_path_table((23, 22, 22, 0) call_path_table((24, 23, 23, 0) call_path_table((25, 24, 24, 0) call_path_table((26, 25, 25, 0) call_path_table((27, 26, 26, 0) call_path_table((28, 27, 27, 0) call_path_table((29, 28, 28, 0) call_path_table((30, 29, 29, 0) call_path_table((31, 30, 30, 0) call_path_table((32, 31, 31, 0) call_path_table((33, 32, 32, 0) call_path_table((34, 33, 33, 0) call_path_table((35, 34, 20, 0) sample_table((8, 1, 1, 1, 2, 1, 20, 49, -2046878127, 588306954378624, -1, 0, 0, 0, 0, 2534317, 0, 0, 128933429281, 0, 0, 35, 0, 0, 0, -1, -1)) ================================================================= ==1272975==ERROR: LeakSanitizer: detected memory leaks Direct leak of 13628 byte(s) in 6 object(s) allocated from: #0 0x56354f60c092 in malloc (/tmp/perf/perf+0x29c092) #1 0x7ff25c7d02e7 in _PyObject_Malloc /build/python3.11/../Objects/obmalloc.c:2003:11 #2 0x7ff25c7d02e7 in _PyObject_Malloc /build/python3.11/../Objects/obmalloc.c:1996:1 SUMMARY: AddressSanitizer: 13628 byte(s) leaked in 6 allocation(s). --- Cleaning up --- ---- end(-1) ---- 98: perf script tests : FAILED! ``` Disable leak sanitizer when running specific perf+python tests to avoid this. This causes the tests to pass when run with leak sanitizer. Reviewed-by: Aditya Gupta <adityag@linux.ibm.com> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Richter <tmricht@linux.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
99 lines
2 KiB
Bash
Executable file
99 lines
2 KiB
Bash
Executable file
#!/bin/sh
|
|
# perf script tests
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
set -e
|
|
|
|
temp_dir=$(mktemp -d /tmp/perf-test-script.XXXXXXXXXX)
|
|
|
|
perfdatafile="${temp_dir}/perf.data"
|
|
db_test="${temp_dir}/db_test.py"
|
|
|
|
err=0
|
|
|
|
cleanup()
|
|
{
|
|
trap - EXIT TERM INT
|
|
sane=$(echo "${temp_dir}" | cut -b 1-21)
|
|
if [ "${sane}" = "/tmp/perf-test-script" ] ; then
|
|
echo "--- Cleaning up ---"
|
|
rm -rf "${temp_dir:?}/"*
|
|
rmdir "${temp_dir}"
|
|
fi
|
|
}
|
|
|
|
trap_cleanup()
|
|
{
|
|
cleanup
|
|
exit 1
|
|
}
|
|
|
|
trap trap_cleanup EXIT TERM INT
|
|
|
|
|
|
test_db()
|
|
{
|
|
echo "DB test"
|
|
|
|
# Check if python script is supported
|
|
if perf version --build-options | grep python | grep -q OFF ; then
|
|
echo "SKIP: python scripting is not supported"
|
|
err=2
|
|
return
|
|
fi
|
|
|
|
cat << "_end_of_file_" > "${db_test}"
|
|
perf_db_export_mode = True
|
|
perf_db_export_calls = False
|
|
perf_db_export_callchains = True
|
|
|
|
def sample_table(*args):
|
|
print(f'sample_table({args})')
|
|
|
|
def call_path_table(*args):
|
|
print(f'call_path_table({args}')
|
|
_end_of_file_
|
|
case $(uname -m)
|
|
in s390x)
|
|
cmd_flags="--call-graph dwarf -e cpu-clock";;
|
|
*)
|
|
cmd_flags="-g";;
|
|
esac
|
|
|
|
perf record $cmd_flags -o "${perfdatafile}" true
|
|
# Disable lsan to avoid warnings about python memory leaks.
|
|
export ASAN_OPTIONS=detect_leaks=0
|
|
perf script -i "${perfdatafile}" -s "${db_test}"
|
|
export ASAN_OPTIONS=
|
|
echo "DB test [Success]"
|
|
}
|
|
|
|
test_parallel_perf()
|
|
{
|
|
echo "parallel-perf test"
|
|
if ! python3 --version >/dev/null 2>&1 ; then
|
|
echo "SKIP: no python3"
|
|
err=2
|
|
return
|
|
fi
|
|
pp=$(dirname "$0")/../../scripts/python/parallel-perf.py
|
|
if [ ! -f "${pp}" ] ; then
|
|
echo "SKIP: parallel-perf.py script not found "
|
|
err=2
|
|
return
|
|
fi
|
|
perf_data="${temp_dir}/pp-perf.data"
|
|
output1_dir="${temp_dir}/output1"
|
|
output2_dir="${temp_dir}/output2"
|
|
perf record -o "${perf_data}" --sample-cpu uname
|
|
python3 "${pp}" -o "${output1_dir}" --jobs 4 --verbose -- perf script -i "${perf_data}"
|
|
python3 "${pp}" -o "${output2_dir}" --jobs 4 --verbose --per-cpu -- perf script -i "${perf_data}"
|
|
echo "parallel-perf test [Success]"
|
|
}
|
|
|
|
test_db
|
|
test_parallel_perf
|
|
|
|
cleanup
|
|
|
|
exit $err
|