2 # SPDX-License-Identifier: GPL-2.0
3 # description: ftrace - test reading of set_ftrace_filter
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).
12 # The triggers are set within the set_ftrace_filter file
13 check_filter_file set_ftrace_filter
20 FILTER=set_ftrace_filter
24 ALL_FUNCS="#### all functions enabled ####"
27 if ! echo "$1" | grep -q "^$2\$"; then
30 echo "$1" | grep -v "^$2\$"
34 check_set_ftrace_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'`
41 while [ $# -gt 0 ]; do
43 if cat=`test_func "$cat" "$1"`; then
46 if dd1=`test_func "$dd1" "$1"`; then
49 if dd100=`test_func "$dd100" "$1"`; then
55 if [ -n "$cat" ]; then
58 if [ -n "$dd1" ]; then
61 if [ -n "$dd100" ]; then
67 if check_set_ftrace_filter "$ALL_FUNCS"; then
68 fail "Expected only $ALL_FUNCS"
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"
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"
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"
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"
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"
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"
103 if check_set_ftrace_filter "$ALL_FUNCS"; then
104 fail "Expected $ALL_FUNCS"
107 echo "$FUNC1" > set_ftrace_filter
108 if check_set_ftrace_filter "$FUNC1" ; then
109 fail "Expected $FUNC1"
112 echo "$FUNC2" >> set_ftrace_filter
113 if check_set_ftrace_filter "$FUNC1" "$FUNC2" ; then
114 fail "Expected $FUNC1 and $FUNC2"
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`
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
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
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
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
148 echo '!*:traceoff' >> set_ftrace_filter