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 86initialize_ftrace() { # Reset ftrace to initial-state 87# As the initial state, ftrace will be set to nop tracer, 88# no events, no triggers, no filters, no function filters, 89# no probes, and tracing on. 90 disable_tracing 91 reset_tracer 92 reset_trigger 93 reset_events_filter 94 reset_ftrace_filter 95 disable_events 96 [ -f set_event_pid ] && echo > set_event_pid 97 [ -f set_ftrace_pid ] && echo > set_ftrace_pid 98 [ -f set_ftrace_notrace ] && echo > set_ftrace_notrace 99 [ -f set_graph_function ] && echo | tee set_graph_* 100 [ -f stack_trace_filter ] && echo > stack_trace_filter 101 [ -f kprobe_events ] && echo > kprobe_events 102 [ -f uprobe_events ] && echo > uprobe_events 103 [ -f synthetic_events ] && echo > synthetic_events 104 [ -f snapshot ] && echo 0 > snapshot 105 clear_trace 106 enable_tracing 107} 108 109check_requires() { # Check required files and tracers 110 for i in "$@" ; do 111 r=${i%:README} 112 t=${i%:tracer} 113 if [ $t != $i ]; then 114 if ! grep -wq $t available_tracers ; then 115 echo "Required tracer $t is not configured." 116 exit_unsupported 117 fi 118 elif [ $r != $i ]; then 119 if ! grep -Fq "$r" README ; then 120 echo "Required feature pattern \"$r\" is not in README." 121 exit_unsupported 122 fi 123 elif [ ! -e $i ]; then 124 echo "Required feature interface $i doesn't exist." 125 exit_unsupported 126 fi 127 done 128} 129 130LOCALHOST=127.0.0.1 131 132yield() { 133 ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1 134} 135 136# Since probe event command may include backslash, explicitly use printf "%s" 137# to NOT interpret it. 138ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file 139 pos=$(printf "%s" "${2%^*}" | wc -c) # error position 140 command=$(printf "%s" "$2" | tr -d ^) 141 echo "Test command: $command" 142 echo > error_log 143 (! printf "%s" "$command" >> "$3" ) 2> /dev/null 144 grep "$1: error:" -A 3 error_log 145 N=$(tail -n 1 error_log | wc -c) 146 # " Command: " and "^\n" => 13 147 test $(expr 13 + $pos) -eq $N 148} 149