1clear_trace() { # reset trace output 2 echo > trace 3} 4 5disable_tracing() { # stop trace recording 6 echo 0 > tracing_on 7} 8 9enable_tracing() { # start trace recording 10 echo 1 > tracing_on 11} 12 13reset_tracer() { # reset the current tracer 14 echo nop > current_tracer 15} 16 17reset_trigger_file() { 18 # remove action triggers first 19 grep -H ':on[^:]*(' $@ | 20 while read line; do 21 cmd=`echo $line | cut -f2- -d: | cut -f1 -d"["` 22 file=`echo $line | cut -f1 -d:` 23 echo "!$cmd" >> $file 24 done 25 grep -Hv ^# $@ | 26 while read line; do 27 cmd=`echo $line | cut -f2- -d: | cut -f1 -d"["` 28 file=`echo $line | cut -f1 -d:` 29 echo "!$cmd" > $file 30 done 31} 32 33reset_trigger() { # reset all current setting triggers 34 if [ -d events/synthetic ]; then 35 reset_trigger_file events/synthetic/*/trigger 36 fi 37 reset_trigger_file events/*/*/trigger 38} 39 40reset_events_filter() { # reset all current setting filters 41 grep -v ^none events/*/*/filter | 42 while read line; do 43 echo 0 > `echo $line | cut -f1 -d:` 44 done 45} 46 47reset_ftrace_filter() { # reset all triggers in set_ftrace_filter 48 if [ ! -f set_ftrace_filter ]; then 49 return 0 50 fi 51 echo > set_ftrace_filter 52 grep -v '^#' set_ftrace_filter | while read t; do 53 tr=`echo $t | cut -d: -f2` 54 if [ "$tr" = "" ]; then 55 continue 56 fi 57 if ! grep -q "$t" set_ftrace_filter; then 58 continue; 59 fi 60 name=`echo $t | cut -d: -f1 | cut -d' ' -f1` 61 if [ $tr = "enable_event" -o $tr = "disable_event" ]; then 62 tr=`echo $t | cut -d: -f2-4` 63 limit=`echo $t | cut -d: -f5` 64 else 65 tr=`echo $t | cut -d: -f2` 66 limit=`echo $t | cut -d: -f3` 67 fi 68 if [ "$limit" != "unlimited" ]; then 69 tr="$tr:$limit" 70 fi 71 echo "!$name:$tr" > set_ftrace_filter 72 done 73} 74 75disable_events() { 76 echo 0 > events/enable 77} 78 79clear_synthetic_events() { # reset all current synthetic events 80 grep -v ^# synthetic_events | 81 while read line; do 82 echo "!$line" >> synthetic_events 83 done 84} 85 86clear_dynamic_events() { # reset all current dynamic events 87 again=1 88 stop=1 89 # loop mulitple times as some events require other to be removed first 90 while [ $again -eq 1 ]; do 91 stop=$((stop+1)) 92 # Prevent infinite loops 93 if [ $stop -gt 10 ]; then 94 break; 95 fi 96 again=2 97 grep -v '^#' dynamic_events| 98 while read line; do 99 del=`echo $line | sed -e 's/^.\([^ ]*\).*/-\1/'` 100 if ! echo "$del" >> dynamic_events; then 101 again=1 102 fi 103 done 104 done 105} 106 107initialize_ftrace() { # Reset ftrace to initial-state 108# As the initial state, ftrace will be set to nop tracer, 109# no events, no triggers, no filters, no function filters, 110# no probes, and tracing on. 111 disable_tracing 112 reset_tracer 113 reset_trigger 114 reset_events_filter 115 reset_ftrace_filter 116 disable_events 117 clear_dynamic_events 118 [ -f set_event_pid ] && echo > set_event_pid 119 [ -f set_ftrace_pid ] && echo > set_ftrace_pid 120 [ -f set_ftrace_notrace ] && echo > set_ftrace_notrace 121 [ -f set_graph_function ] && echo | tee set_graph_* 122 [ -f stack_trace_filter ] && echo > stack_trace_filter 123 [ -f kprobe_events ] && echo > kprobe_events 124 [ -f uprobe_events ] && echo > uprobe_events 125 [ -f synthetic_events ] && echo > synthetic_events 126 [ -f snapshot ] && echo 0 > snapshot 127 128# Stop tracing while reading the trace file by default, to prevent 129# the test results while checking it and to avoid taking a long time 130# to check the result. 131 [ -f options/pause-on-trace ] && echo 1 > options/pause-on-trace 132 133 clear_trace 134 enable_tracing 135} 136 137finish_ftrace() { 138 initialize_ftrace 139# And recover it to default. 140 [ -f options/pause-on-trace ] && echo 0 > options/pause-on-trace 141} 142 143check_requires() { # Check required files and tracers 144 for i in "$@" ; do 145 p=${i%:program} 146 r=${i%:README} 147 t=${i%:tracer} 148 if [ $p != $i ]; then 149 if ! which $p ; then 150 echo "Required program $p is not found." 151 exit_unresolved 152 fi 153 elif [ $t != $i ]; then 154 if ! grep -wq $t available_tracers ; then 155 echo "Required tracer $t is not configured." 156 exit_unsupported 157 fi 158 elif [ "$r" != "$i" ]; then 159 if ! grep -Fq "$r" README ; then 160 echo "Required feature pattern \"$r\" is not in README." 161 exit_unsupported 162 fi 163 elif [ ! -e $i ]; then 164 echo "Required feature interface $i doesn't exist." 165 exit_unsupported 166 fi 167 done 168} 169 170LOCALHOST=127.0.0.1 171 172yield() { 173 ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1 174} 175 176# The fork function in the kernel was renamed from "_do_fork" to 177# "kernel_fork". As older tests should still work with older kernels 178# as well as newer kernels, check which version of fork is used on this 179# kernel so that the tests can use the fork function for the running kernel. 180FUNCTION_FORK=`(if grep '\bkernel_clone\b' /proc/kallsyms > /dev/null; then 181 echo kernel_clone; else echo '_do_fork'; fi)` 182 183# Since probe event command may include backslash, explicitly use printf "%s" 184# to NOT interpret it. 185ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file 186 pos=$(printf "%s" "${2%^*}" | wc -c) # error position 187 command=$(printf "%s" "$2" | tr -d ^) 188 echo "Test command: $command" 189 echo > error_log 190 (! printf "%s" "$command" >> "$3" ) 2> /dev/null 191 grep "$1: error:" -A 3 error_log 192 N=$(tail -n 1 error_log | wc -c) 193 # " Command: " and "^\n" => 13 194 test $(expr 13 + $pos) -eq $N 195} 196