GNU Linux-libre 4.19.304-gnu1
[releases.git] / tools / testing / selftests / ftrace / test.d / ftrace / func_event_triggers.tc
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
3 # description: ftrace - test for function event triggers
4 # flags: instance
5 #
6 # Ftrace allows to add triggers to functions, such as enabling or disabling
7 # tracing, enabling or disabling trace events, or recording a stack trace
8 # within the ring buffer.
9 #
10 # This test is designed to test event triggers
11 #
12
13 # The triggers are set within the set_ftrace_filter file
14 if [ ! -f set_ftrace_filter ]; then
15     echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
16     exit_unsupported
17 fi
18
19 do_reset() {
20     reset_ftrace_filter
21     reset_tracer
22     disable_events
23     clear_trace
24     enable_tracing
25 }
26
27 fail() { # mesg
28     do_reset
29     echo $1
30     exit_fail
31 }
32
33 SLEEP_TIME=".1"
34
35 do_reset
36
37 echo "Testing function probes with events:"
38
39 EVENT="sched:sched_switch"
40 EVENT_ENABLE="events/sched/sched_switch/enable"
41
42 cnt_trace() {
43     grep -v '^#' trace | wc -l
44 }
45
46 test_event_enabled() {
47     val=$1
48     check_times=10              # wait for 10 * SLEEP_TIME at most
49
50     while [ $check_times -ne 0 ]; do
51         e=`cat $EVENT_ENABLE`
52         if [ "$e" = $val ]; then
53             return 0
54         fi
55         sleep $SLEEP_TIME
56         check_times=$((check_times - 1))
57     done
58
59     fail "Expected $val but found $e"
60 }
61
62 run_enable_disable() {
63     enable=$1                   # enable
64     Enable=$2                   # Enable
65     check_disable=$3            # 0
66     check_enable_star=$4        # 1*
67     check_disable_star=$5       # 0*
68
69     cnt=`cnt_trace`
70     if [ $cnt -ne 0 ]; then
71         fail "Found junk in trace file"
72     fi
73
74     echo "$Enable event all the time"
75
76     echo $check_disable > $EVENT_ENABLE
77     sleep $SLEEP_TIME
78
79     test_event_enabled $check_disable
80
81     echo "schedule:${enable}_event:$EVENT" > set_ftrace_filter
82     if [ -d ../../instances ]; then # Check instances
83         cur=`cat set_ftrace_filter`
84         top=`cat ../../set_ftrace_filter`
85         if [ "$cur" = "$top" ]; then
86             echo "This kernel is too old to support per instance filter"
87             reset_ftrace_filter
88             exit_unsupported
89         fi
90     fi
91
92     echo " make sure it works 5 times"
93
94     for i in `seq 5`; do
95         sleep $SLEEP_TIME
96         echo "  test $i"
97         test_event_enabled $check_enable_star
98
99         echo $check_disable > $EVENT_ENABLE
100     done
101     sleep $SLEEP_TIME
102     echo " make sure it's still works"
103     test_event_enabled $check_enable_star
104
105     reset_ftrace_filter
106
107     echo " make sure it only works 3 times"
108
109     echo $check_disable > $EVENT_ENABLE
110     sleep $SLEEP_TIME
111
112     echo "schedule:${enable}_event:$EVENT:3" > set_ftrace_filter
113
114     for i in `seq 3`; do
115         sleep $SLEEP_TIME
116         echo "  test $i"
117         test_event_enabled $check_enable_star
118
119         echo $check_disable > $EVENT_ENABLE
120     done
121
122     sleep $SLEEP_TIME
123     echo " make sure it stop working"
124     test_event_enabled $check_disable_star
125
126     do_reset
127 }
128
129 run_enable_disable enable Enable 0 "1*" "0*"
130 run_enable_disable disable Disable 1 "0*" "1*"