xref: /linux/tools/perf/tests/shell/ftrace.sh (revision c34e9ab9a612ee8b18273398ef75c207b01f516d)
1#!/bin/sh
2# perf ftrace tests
3# SPDX-License-Identifier: GPL-2.0
4
5set -e
6
7# perf ftrace commands only works for root
8if [ "$(id -u)" != 0 ]; then
9    echo "perf ftrace test  [Skipped: no permission]"
10    exit 2
11fi
12
13output=$(mktemp /tmp/__perf_test.ftrace.XXXXXX)
14
15cleanup() {
16  rm -f "${output}"
17
18  trap - EXIT TERM INT
19}
20
21trap_cleanup() {
22  cleanup
23  exit 1
24}
25trap trap_cleanup EXIT TERM INT
26
27# this will be set in test_ftrace_trace()
28target_function=
29
30test_ftrace_list() {
31    echo "perf ftrace list test"
32    perf ftrace -F > "${output}"
33    # this will be used in test_ftrace_trace()
34    sleep_functions=$(grep 'sys_.*sleep$' "${output}")
35    echo "syscalls for sleep:"
36    echo "${sleep_functions}"
37    echo "perf ftrace list test  [Success]"
38}
39
40test_ftrace_trace() {
41    echo "perf ftrace trace test"
42    perf ftrace trace --graph-opts depth=5 sleep 0.1 > "${output}"
43    # it should have some function name contains 'sleep'
44    grep "^#" "${output}"
45    grep -F 'sleep()' "${output}"
46    # find actual syscall function name
47    for FN in ${sleep_functions}; do
48	if grep -q "${FN}" "${output}"; then
49	    target_function="${FN}"
50	    echo "perf ftrace trace test  [Success]"
51	    return
52	fi
53    done
54
55    echo "perf ftrace trace test  [Failure: sleep syscall not found]"
56    exit 1
57}
58
59test_ftrace_latency() {
60    echo "perf ftrace latency test"
61    echo "target function: ${target_function}"
62    perf ftrace latency -T "${target_function}" sleep 0.1 > "${output}"
63    grep "^#" "${output}"
64    grep "###" "${output}"
65    echo "perf ftrace latency test  [Success]"
66}
67
68test_ftrace_profile() {
69    echo "perf ftrace profile test"
70    perf ftrace profile -m 16M sleep 0.1 > "${output}"
71    grep ^# "${output}"
72    grep sleep "${output}"
73    grep schedule "${output}"
74    grep execve "${output}"
75    time_re="[[:space:]]+1[[:digit:]]{5}\.[[:digit:]]{3}"
76    # 100283.000 100283.000 100283.000          1   __x64_sys_clock_nanosleep
77    # Check for one *clock_nanosleep line with a Count of just 1 that takes a bit more than 0.1 seconds
78    # Strip the _x64_sys part to work with other architectures
79    grep -E "^${time_re}${time_re}${time_re}[[:space:]]+1[[:space:]]+.*clock_nanosleep" "${output}"
80    echo "perf ftrace profile test  [Success]"
81}
82
83test_ftrace_list
84test_ftrace_trace
85test_ftrace_latency
86test_ftrace_profile
87
88cleanup
89exit 0
90