xref: /linux/tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc (revision 307797159ac25fe5a2048bf5c6a5718298edca57)
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
14if [ ! -f set_ftrace_filter ]; then
15    echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
16    exit_unsupported
17fi
18
19do_reset() {
20    reset_ftrace_filter
21    reset_tracer
22    disable_events
23    clear_trace
24    enable_tracing
25}
26
27fail() { # mesg
28    do_reset
29    echo $1
30    exit_fail
31}
32
33SLEEP_TIME=".1"
34
35do_reset
36
37echo "Testing function probes with events:"
38
39EVENT="sched:sched_switch"
40EVENT_ENABLE="events/sched/sched_switch/enable"
41
42cnt_trace() {
43    grep -v '^#' trace | wc -l
44}
45
46test_event_enabled() {
47    val=$1
48
49    e=`cat $EVENT_ENABLE`
50    if [ "$e" != $val ]; then
51	fail "Expected $val but found $e"
52    fi
53}
54
55run_enable_disable() {
56    enable=$1			# enable
57    Enable=$2			# Enable
58    check_disable=$3		# 0
59    check_enable_star=$4	# 1*
60    check_disable_star=$5	# 0*
61
62    cnt=`cnt_trace`
63    if [ $cnt -ne 0 ]; then
64	fail "Found junk in trace file"
65    fi
66
67    echo "$Enable event all the time"
68
69    echo $check_disable > $EVENT_ENABLE
70    sleep $SLEEP_TIME
71
72    test_event_enabled $check_disable
73
74    echo "schedule:${enable}_event:$EVENT" > set_ftrace_filter
75    if [ -d ../../instances ]; then # Check instances
76	cur=`cat set_ftrace_filter`
77	top=`cat ../../set_ftrace_filter`
78	if [ "$cur" = "$top" ]; then
79	    echo "This kernel is too old to support per instance filter"
80	    reset_ftrace_filter
81	    exit_unsupported
82	fi
83    fi
84
85    echo " make sure it works 5 times"
86
87    for i in `seq 5`; do
88	sleep $SLEEP_TIME
89	echo "  test $i"
90	test_event_enabled $check_enable_star
91
92	echo $check_disable > $EVENT_ENABLE
93    done
94    sleep $SLEEP_TIME
95    echo " make sure it's still works"
96    test_event_enabled $check_enable_star
97
98    reset_ftrace_filter
99
100    echo " make sure it only works 3 times"
101
102    echo $check_disable > $EVENT_ENABLE
103    sleep $SLEEP_TIME
104
105    echo "schedule:${enable}_event:$EVENT:3" > set_ftrace_filter
106
107    for i in `seq 3`; do
108	sleep $SLEEP_TIME
109	echo "  test $i"
110	test_event_enabled $check_enable_star
111
112	echo $check_disable > $EVENT_ENABLE
113    done
114
115    sleep $SLEEP_TIME
116    echo " make sure it stop working"
117    test_event_enabled $check_disable_star
118
119    do_reset
120}
121
122run_enable_disable enable Enable 0 "1*" "0*"
123run_enable_disable disable Disable 1 "0*" "1*"
124