mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
5f2c8f4e10
On s390 the perf test case ftrace sometimes fails as follows: # ./perf test ftrace 79: perf ftrace tests : FAILED! # The failure depends on the kernel .config file. Some configurations always work fine, some do not. The ftrace profile test mostly fails, because the ring buffer was not large enough, and some lines (especially the interesting ones with nanosleep in it) where dropped. To achieve success for all tested kernel configurations, enlarge the buffer to store the traces completely without wrapping. The default buffer size is too small for all kernel configurations. Set the buffer size of for the ftrace profile test to 16 MB. Output after: # ./perf test ftrace 79: perf ftrace tests : Ok # Signed-off-by: Thomas Richter <tmricht@linux.ibm.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: agordeev@linux.ibm.com Cc: gor@linux.ibm.com Cc: hca@linux.ibm.com Cc: sumanthk@linux.ibm.com Link: https://lore.kernel.org/r/20241119064856.641446-1-tmricht@linux.ibm.com Suggested-by: Sven Schnelle <svens@linux.ibm.com> Suggested-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
90 lines
2.3 KiB
Bash
Executable File
90 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
# perf ftrace tests
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
set -e
|
|
|
|
# perf ftrace commands only works for root
|
|
if [ "$(id -u)" != 0 ]; then
|
|
echo "perf ftrace test [Skipped: no permission]"
|
|
exit 2
|
|
fi
|
|
|
|
output=$(mktemp /tmp/__perf_test.ftrace.XXXXXX)
|
|
|
|
cleanup() {
|
|
rm -f "${output}"
|
|
|
|
trap - EXIT TERM INT
|
|
}
|
|
|
|
trap_cleanup() {
|
|
cleanup
|
|
exit 1
|
|
}
|
|
trap trap_cleanup EXIT TERM INT
|
|
|
|
# this will be set in test_ftrace_trace()
|
|
target_function=
|
|
|
|
test_ftrace_list() {
|
|
echo "perf ftrace list test"
|
|
perf ftrace -F > "${output}"
|
|
# this will be used in test_ftrace_trace()
|
|
sleep_functions=$(grep 'sys_.*sleep$' "${output}")
|
|
echo "syscalls for sleep:"
|
|
echo "${sleep_functions}"
|
|
echo "perf ftrace list test [Success]"
|
|
}
|
|
|
|
test_ftrace_trace() {
|
|
echo "perf ftrace trace test"
|
|
perf ftrace trace --graph-opts depth=5 sleep 0.1 > "${output}"
|
|
# it should have some function name contains 'sleep'
|
|
grep "^#" "${output}"
|
|
grep -F 'sleep()' "${output}"
|
|
# find actual syscall function name
|
|
for FN in ${sleep_functions}; do
|
|
if grep -q "${FN}" "${output}"; then
|
|
target_function="${FN}"
|
|
echo "perf ftrace trace test [Success]"
|
|
return
|
|
fi
|
|
done
|
|
|
|
echo "perf ftrace trace test [Failure: sleep syscall not found]"
|
|
exit 1
|
|
}
|
|
|
|
test_ftrace_latency() {
|
|
echo "perf ftrace latency test"
|
|
echo "target function: ${target_function}"
|
|
perf ftrace latency -T "${target_function}" sleep 0.1 > "${output}"
|
|
grep "^#" "${output}"
|
|
grep "###" "${output}"
|
|
echo "perf ftrace latency test [Success]"
|
|
}
|
|
|
|
test_ftrace_profile() {
|
|
echo "perf ftrace profile test"
|
|
perf ftrace profile -m 16M sleep 0.1 > "${output}"
|
|
grep ^# "${output}"
|
|
grep sleep "${output}"
|
|
grep schedule "${output}"
|
|
grep execve "${output}"
|
|
time_re="[[:space:]]+1[[:digit:]]{5}\.[[:digit:]]{3}"
|
|
# 100283.000 100283.000 100283.000 1 __x64_sys_clock_nanosleep
|
|
# Check for one *clock_nanosleep line with a Count of just 1 that takes a bit more than 0.1 seconds
|
|
# Strip the _x64_sys part to work with other architectures
|
|
grep -E "^${time_re}${time_re}${time_re}[[:space:]]+1[[:space:]]+.*clock_nanosleep" "${output}"
|
|
echo "perf ftrace profile test [Success]"
|
|
}
|
|
|
|
test_ftrace_list
|
|
test_ftrace_trace
|
|
test_ftrace_latency
|
|
test_ftrace_profile
|
|
|
|
cleanup
|
|
exit 0
|