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