| #!/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 |