Merge tag 'drm/tegra/for-5.7-fixes' of git://anongit.freedesktop.org/tegra/linux...
[linux-2.6-microblaze.git] / tools / testing / selftests / ftrace / test.d / ftrace / func_set_ftrace_file.tc
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
3 # description: ftrace - test reading of set_ftrace_filter
4 #
5 # The set_ftrace_filter file of ftrace is used to list functions as well as
6 # triggers (probes) attached to functions. The code to read this file is not
7 # straight forward and has had various bugs in the past. This test is designed
8 # to add functions and triggers to that file in various ways and read that
9 # file in various ways (cat vs dd).
10 #
11
12 # The triggers are set within the set_ftrace_filter file
13 check_filter_file set_ftrace_filter
14
15 fail() { # mesg
16     echo $1
17     exit_fail
18 }
19
20 FILTER=set_ftrace_filter
21 FUNC1="schedule"
22 FUNC2="do_softirq"
23
24 ALL_FUNCS="#### all functions enabled ####"
25
26 test_func() {
27     if ! echo "$1" | grep -q "^$2\$"; then
28         return 0
29     fi
30     echo "$1" | grep -v "^$2\$"
31     return 1
32 }
33
34 check_set_ftrace_filter() {
35     cat=`cat $FILTER`
36     dd1=`dd if=$FILTER bs=1 | grep -v -e 'records in' -e 'records out' -e 'bytes copied'`
37     dd100=`dd if=$FILTER bs=100 | grep -v -e 'records in' -e 'records out' -e 'bytes copied'`
38
39     echo "Testing '$@'"
40
41     while [ $# -gt 0 ]; do
42         echo "test $1"
43         if cat=`test_func "$cat" "$1"`; then
44             return 0
45         fi
46         if dd1=`test_func "$dd1" "$1"`; then
47             return 0
48         fi
49         if dd100=`test_func "$dd100" "$1"`; then
50             return 0
51         fi
52         shift
53     done
54
55     if [ -n "$cat" ]; then
56         return 0
57     fi
58     if [ -n "$dd1" ]; then
59         return 0
60     fi
61     if [ -n "$dd100" ]; then
62         return 0
63     fi
64     return 1;
65 }
66
67 if check_set_ftrace_filter "$ALL_FUNCS"; then
68     fail "Expected only $ALL_FUNCS"
69 fi
70
71 echo "$FUNC1:traceoff" > set_ftrace_filter
72 if check_set_ftrace_filter "$ALL_FUNCS" "$FUNC1:traceoff:unlimited"; then
73     fail "Expected $ALL_FUNCS and $FUNC1:traceoff:unlimited"
74 fi
75
76 echo "$FUNC1" > set_ftrace_filter
77 if check_set_ftrace_filter "$FUNC1" "$FUNC1:traceoff:unlimited"; then
78     fail "Expected $FUNC1 and $FUNC1:traceoff:unlimited"
79 fi
80
81 echo "$FUNC2" >> set_ftrace_filter
82 if check_set_ftrace_filter "$FUNC1" "$FUNC2" "$FUNC1:traceoff:unlimited"; then
83     fail "Expected $FUNC1 $FUNC2 and $FUNC1:traceoff:unlimited"
84 fi
85
86 echo "$FUNC2:traceoff" >> set_ftrace_filter
87 if check_set_ftrace_filter "$FUNC1" "$FUNC2" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
88     fail "Expected $FUNC1 $FUNC2 $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
89 fi
90
91 echo "$FUNC1" > set_ftrace_filter
92 if check_set_ftrace_filter "$FUNC1" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
93     fail "Expected $FUNC1 $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
94 fi
95
96 echo > set_ftrace_filter
97 if check_set_ftrace_filter "$ALL_FUNCS" "$FUNC1:traceoff:unlimited" "$FUNC2:traceoff:unlimited"; then
98     fail "Expected $ALL_FUNCS $FUNC1:traceoff:unlimited and $FUNC2:traceoff:unlimited"
99 fi
100
101 reset_ftrace_filter
102
103 if check_set_ftrace_filter "$ALL_FUNCS"; then
104     fail "Expected $ALL_FUNCS"
105 fi
106
107 echo "$FUNC1" > set_ftrace_filter
108 if check_set_ftrace_filter "$FUNC1" ; then
109     fail "Expected $FUNC1"
110 fi
111
112 echo "$FUNC2" >> set_ftrace_filter
113 if check_set_ftrace_filter "$FUNC1" "$FUNC2" ; then
114     fail "Expected $FUNC1 and $FUNC2"
115 fi
116
117 test_actual() { # Compares $TMPDIR/expected with set_ftrace_filter
118     cat set_ftrace_filter | grep -v '#' | cut -d' ' -f1 | cut -d':' -f1 | sort -u > $TMPDIR/actual
119     DIFF=`diff $TMPDIR/actual $TMPDIR/expected`
120     test -z "$DIFF"
121 }
122
123 # Set traceoff trigger for all fuctions with "lock" in their name
124 cat available_filter_functions | cut -d' ' -f1 |  grep 'lock' | sort -u > $TMPDIR/expected
125 echo '*lock*:traceoff' > set_ftrace_filter
126 test_actual
127
128 # now remove all with 'try' in it, and end with lock
129 grep -v 'try.*lock$' $TMPDIR/expected > $TMPDIR/expected2
130 mv $TMPDIR/expected2 $TMPDIR/expected
131 echo '!*try*lock:traceoff' >> set_ftrace_filter
132 test_actual
133
134 # remove all that start with "m" and end with "lock"
135 grep -v '^m.*lock$' $TMPDIR/expected > $TMPDIR/expected2
136 mv $TMPDIR/expected2 $TMPDIR/expected
137 echo '!m*lock:traceoff' >> set_ftrace_filter
138 test_actual
139
140 # remove all that start with "c" and have "unlock"
141 grep -v '^c.*unlock' $TMPDIR/expected > $TMPDIR/expected2
142 mv $TMPDIR/expected2 $TMPDIR/expected
143 echo '!c*unlock*:traceoff' >> set_ftrace_filter
144 test_actual
145
146 # clear all the rest
147 > $TMPDIR/expected
148 echo '!*:traceoff' >> set_ftrace_filter
149 test_actual
150
151 rm $TMPDIR/expected
152 rm $TMPDIR/actual
153
154 exit 0