| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #!/bin/bash
- # 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 --graph-opts depth=5 sleep 0.1 > "${output}"
- grep ^# "${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
|