1ee3988c7SSteven Rostedt (Red Hat)clear_trace() { # reset trace output 2ee3988c7SSteven Rostedt (Red Hat) echo > trace 3ee3988c7SSteven Rostedt (Red Hat)} 4ee3988c7SSteven Rostedt (Red Hat) 5ee3988c7SSteven Rostedt (Red Hat)disable_tracing() { # stop trace recording 6ee3988c7SSteven Rostedt (Red Hat) echo 0 > tracing_on 7ee3988c7SSteven Rostedt (Red Hat)} 8ee3988c7SSteven Rostedt (Red Hat) 9ee3988c7SSteven Rostedt (Red Hat)enable_tracing() { # start trace recording 10ee3988c7SSteven Rostedt (Red Hat) echo 1 > tracing_on 11ee3988c7SSteven Rostedt (Red Hat)} 12ee3988c7SSteven Rostedt (Red Hat) 13ee3988c7SSteven Rostedt (Red Hat)reset_tracer() { # reset the current tracer 14ee3988c7SSteven Rostedt (Red Hat) echo nop > current_tracer 15ee3988c7SSteven Rostedt (Red Hat)} 16cfa0963dSMasami Hiramatsu 17756b56a9SSteven Rostedt (VMware)reset_trigger_file() { 18756b56a9SSteven Rostedt (VMware) # remove action triggers first 19756b56a9SSteven Rostedt (VMware) grep -H ':on[^:]*(' $@ | 20cfa0963dSMasami Hiramatsu while read line; do 21922a418dSSteven Rostedt (VMware) cmd=`echo $line | cut -f2- -d: | cut -f1 -d"["` 22756b56a9SSteven Rostedt (VMware) file=`echo $line | cut -f1 -d:` 23756b56a9SSteven Rostedt (VMware) echo "!$cmd" >> $file 24cfa0963dSMasami Hiramatsu done 25756b56a9SSteven Rostedt (VMware) grep -Hv ^# $@ | 26756b56a9SSteven Rostedt (VMware) while read line; do 27922a418dSSteven Rostedt (VMware) cmd=`echo $line | cut -f2- -d: | cut -f1 -d"["` 28756b56a9SSteven Rostedt (VMware) file=`echo $line | cut -f1 -d:` 29756b56a9SSteven Rostedt (VMware) echo "!$cmd" > $file 30756b56a9SSteven Rostedt (VMware) done 31756b56a9SSteven Rostedt (VMware)} 32756b56a9SSteven Rostedt (VMware) 33756b56a9SSteven Rostedt (VMware)reset_trigger() { # reset all current setting triggers 34756b56a9SSteven Rostedt (VMware) if [ -d events/synthetic ]; then 35756b56a9SSteven Rostedt (VMware) reset_trigger_file events/synthetic/*/trigger 36756b56a9SSteven Rostedt (VMware) fi 37756b56a9SSteven Rostedt (VMware) reset_trigger_file events/*/*/trigger 38cfa0963dSMasami Hiramatsu} 39cfa0963dSMasami Hiramatsu 40131f840dSMasami Hiramatsureset_events_filter() { # reset all current setting filters 41131f840dSMasami Hiramatsu grep -v ^none events/*/*/filter | 42131f840dSMasami Hiramatsu while read line; do 43131f840dSMasami Hiramatsu echo 0 > `echo $line | cut -f1 -d:` 44131f840dSMasami Hiramatsu done 45131f840dSMasami Hiramatsu} 46131f840dSMasami Hiramatsu 478e5e19c1SSteven Rostedt (VMware)reset_ftrace_filter() { # reset all triggers in set_ftrace_filter 48fd1baf6cSMasami Hiramatsu if [ ! -f set_ftrace_filter ]; then 49fd1baf6cSMasami Hiramatsu return 0 50fd1baf6cSMasami Hiramatsu fi 518e5e19c1SSteven Rostedt (VMware) echo > set_ftrace_filter 528e5e19c1SSteven Rostedt (VMware) grep -v '^#' set_ftrace_filter | while read t; do 538e5e19c1SSteven Rostedt (VMware) tr=`echo $t | cut -d: -f2` 54d2ffb8d3SNaveen N. Rao if [ "$tr" = "" ]; then 558e5e19c1SSteven Rostedt (VMware) continue 568e5e19c1SSteven Rostedt (VMware) fi 570787ce33SSteven Rostedt (VMware) if ! grep -q "$t" set_ftrace_filter; then 580787ce33SSteven Rostedt (VMware) continue; 590787ce33SSteven Rostedt (VMware) fi 60df9d36d9SSteven Rostedt (VMware) name=`echo $t | cut -d: -f1 | cut -d' ' -f1` 61d2ffb8d3SNaveen N. Rao if [ $tr = "enable_event" -o $tr = "disable_event" ]; then 62df9d36d9SSteven Rostedt (VMware) tr=`echo $t | cut -d: -f2-4` 638e5e19c1SSteven Rostedt (VMware) limit=`echo $t | cut -d: -f5` 648e5e19c1SSteven Rostedt (VMware) else 65df9d36d9SSteven Rostedt (VMware) tr=`echo $t | cut -d: -f2` 668e5e19c1SSteven Rostedt (VMware) limit=`echo $t | cut -d: -f3` 678e5e19c1SSteven Rostedt (VMware) fi 688e5e19c1SSteven Rostedt (VMware) if [ "$limit" != "unlimited" ]; then 698e5e19c1SSteven Rostedt (VMware) tr="$tr:$limit" 708e5e19c1SSteven Rostedt (VMware) fi 71df9d36d9SSteven Rostedt (VMware) echo "!$name:$tr" > set_ftrace_filter 728e5e19c1SSteven Rostedt (VMware) done 738e5e19c1SSteven Rostedt (VMware)} 748e5e19c1SSteven Rostedt (VMware) 75131f840dSMasami Hiramatsudisable_events() { 76131f840dSMasami Hiramatsu echo 0 > events/enable 77131f840dSMasami Hiramatsu} 78131f840dSMasami Hiramatsu 79f06eec4dSRajvi Jingarclear_synthetic_events() { # reset all current synthetic events 80f06eec4dSRajvi Jingar grep -v ^# synthetic_events | 81f06eec4dSRajvi Jingar while read line; do 82f06eec4dSRajvi Jingar echo "!$line" >> synthetic_events 83f06eec4dSRajvi Jingar done 84f06eec4dSRajvi Jingar} 85f06eec4dSRajvi Jingar 86aaac2820SSteven Rostedt (VMware)clear_dynamic_events() { # reset all current dynamic events 87aaac2820SSteven Rostedt (VMware) again=1 88aaac2820SSteven Rostedt (VMware) stop=1 89aaac2820SSteven Rostedt (VMware) # loop mulitple times as some events require other to be removed first 90aaac2820SSteven Rostedt (VMware) while [ $again -eq 1 ]; do 91aaac2820SSteven Rostedt (VMware) stop=$((stop+1)) 92aaac2820SSteven Rostedt (VMware) # Prevent infinite loops 93aaac2820SSteven Rostedt (VMware) if [ $stop -gt 10 ]; then 94aaac2820SSteven Rostedt (VMware) break; 95aaac2820SSteven Rostedt (VMware) fi 96aaac2820SSteven Rostedt (VMware) again=2 97aaac2820SSteven Rostedt (VMware) grep -v '^#' dynamic_events| 98aaac2820SSteven Rostedt (VMware) while read line; do 99aaac2820SSteven Rostedt (VMware) del=`echo $line | sed -e 's/^.\([^ ]*\).*/-\1/'` 100aaac2820SSteven Rostedt (VMware) if ! echo "$del" >> dynamic_events; then 101aaac2820SSteven Rostedt (VMware) again=1 102aaac2820SSteven Rostedt (VMware) fi 103aaac2820SSteven Rostedt (VMware) done 104aaac2820SSteven Rostedt (VMware) done 105aaac2820SSteven Rostedt (VMware)} 106aaac2820SSteven Rostedt (VMware) 107131f840dSMasami Hiramatsuinitialize_ftrace() { # Reset ftrace to initial-state 108131f840dSMasami Hiramatsu# As the initial state, ftrace will be set to nop tracer, 109131f840dSMasami Hiramatsu# no events, no triggers, no filters, no function filters, 110131f840dSMasami Hiramatsu# no probes, and tracing on. 111131f840dSMasami Hiramatsu disable_tracing 112131f840dSMasami Hiramatsu reset_tracer 113131f840dSMasami Hiramatsu reset_trigger 114131f840dSMasami Hiramatsu reset_events_filter 1157590472eSMasami Hiramatsu reset_ftrace_filter 116131f840dSMasami Hiramatsu disable_events 117aaac2820SSteven Rostedt (VMware) clear_dynamic_events 1186e55f320SSteven Rostedt (VMware) [ -f set_event_pid ] && echo > set_event_pid 1196e55f320SSteven Rostedt (VMware) [ -f set_ftrace_pid ] && echo > set_ftrace_pid 120fd1baf6cSMasami Hiramatsu [ -f set_ftrace_notrace ] && echo > set_ftrace_notrace 121131f840dSMasami Hiramatsu [ -f set_graph_function ] && echo | tee set_graph_* 122131f840dSMasami Hiramatsu [ -f stack_trace_filter ] && echo > stack_trace_filter 123131f840dSMasami Hiramatsu [ -f kprobe_events ] && echo > kprobe_events 124131f840dSMasami Hiramatsu [ -f uprobe_events ] && echo > uprobe_events 1257590472eSMasami Hiramatsu [ -f synthetic_events ] && echo > synthetic_events 1267590472eSMasami Hiramatsu [ -f snapshot ] && echo 0 > snapshot 12725b95138SMasami Hiramatsu 12825b95138SMasami Hiramatsu# Stop tracing while reading the trace file by default, to prevent 12925b95138SMasami Hiramatsu# the test results while checking it and to avoid taking a long time 13025b95138SMasami Hiramatsu# to check the result. 13125b95138SMasami Hiramatsu [ -f options/pause-on-trace ] && echo 1 > options/pause-on-trace 13225b95138SMasami Hiramatsu 1337590472eSMasami Hiramatsu clear_trace 134131f840dSMasami Hiramatsu enable_tracing 135131f840dSMasami Hiramatsu} 136cec3adf5SMasami Hiramatsu 13725b95138SMasami Hiramatsufinish_ftrace() { 13825b95138SMasami Hiramatsu initialize_ftrace 13925b95138SMasami Hiramatsu# And recover it to default. 14025b95138SMasami Hiramatsu [ -f options/pause-on-trace ] && echo 0 > options/pause-on-trace 14125b95138SMasami Hiramatsu} 14225b95138SMasami Hiramatsu 143305c8388SMasami Hiramatsucheck_requires() { # Check required files and tracers 1441b8eec51SMasami Hiramatsu for i in "$@" ; do 1454aa4d4deSNaveen N. Rao p=${i%:program} 1461b8eec51SMasami Hiramatsu r=${i%:README} 147305c8388SMasami Hiramatsu t=${i%:tracer} 1484aa4d4deSNaveen N. Rao if [ $p != $i ]; then 1494aa4d4deSNaveen N. Rao if ! which $p ; then 1504aa4d4deSNaveen N. Rao echo "Required program $p is not found." 1514aa4d4deSNaveen N. Rao exit_unresolved 1524aa4d4deSNaveen N. Rao fi 1534aa4d4deSNaveen N. Rao elif [ $t != $i ]; then 154305c8388SMasami Hiramatsu if ! grep -wq $t available_tracers ; then 155305c8388SMasami Hiramatsu echo "Required tracer $t is not configured." 156305c8388SMasami Hiramatsu exit_unsupported 157305c8388SMasami Hiramatsu fi 158210f9df0SSteven Rostedt (VMware) elif [ "$r" != "$i" ]; then 159*4a3134b1SSteven Rostedt # If this is an instance, check the top directory 160*4a3134b1SSteven Rostedt if echo $TRACING_DIR | grep -q "/instances/"; then 161*4a3134b1SSteven Rostedt test="$TRACING_DIR/../.." 162*4a3134b1SSteven Rostedt else 163*4a3134b1SSteven Rostedt test=$TRACING_DIR 164*4a3134b1SSteven Rostedt fi 165*4a3134b1SSteven Rostedt if ! grep -Fq "$r" $test/README ; then 1661b8eec51SMasami Hiramatsu echo "Required feature pattern \"$r\" is not in README." 1671b8eec51SMasami Hiramatsu exit_unsupported 1681b8eec51SMasami Hiramatsu fi 169305c8388SMasami Hiramatsu elif [ ! -e $i ]; then 170fa33e623SMasami Hiramatsu echo "Required feature interface $i doesn't exist." 171fa33e623SMasami Hiramatsu exit_unsupported 172fa33e623SMasami Hiramatsu fi 173fa33e623SMasami Hiramatsu done 174fa33e623SMasami Hiramatsu} 175fa33e623SMasami Hiramatsu 176cec3adf5SMasami HiramatsuLOCALHOST=127.0.0.1 177cec3adf5SMasami Hiramatsu 178cec3adf5SMasami Hiramatsuyield() { 179cec3adf5SMasami Hiramatsu ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1 180cec3adf5SMasami Hiramatsu} 181c5e4114fSTom Zanussi 182dc6bf4daSSteven Rostedt (VMware)# The fork function in the kernel was renamed from "_do_fork" to 183dc6bf4daSSteven Rostedt (VMware)# "kernel_fork". As older tests should still work with older kernels 184dc6bf4daSSteven Rostedt (VMware)# as well as newer kernels, check which version of fork is used on this 185dc6bf4daSSteven Rostedt (VMware)# kernel so that the tests can use the fork function for the running kernel. 186dc6bf4daSSteven Rostedt (VMware)FUNCTION_FORK=`(if grep '\bkernel_clone\b' /proc/kallsyms > /dev/null; then 187dc6bf4daSSteven Rostedt (VMware) echo kernel_clone; else echo '_do_fork'; fi)` 188dc6bf4daSSteven Rostedt (VMware) 1898e923a21SMasami Hiramatsu# Since probe event command may include backslash, explicitly use printf "%s" 1908e923a21SMasami Hiramatsu# to NOT interpret it. 191c5e4114fSTom Zanussiftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file 1928e923a21SMasami Hiramatsu pos=$(printf "%s" "${2%^*}" | wc -c) # error position 1938e923a21SMasami Hiramatsu command=$(printf "%s" "$2" | tr -d ^) 194c5e4114fSTom Zanussi echo "Test command: $command" 195c5e4114fSTom Zanussi echo > error_log 1968e923a21SMasami Hiramatsu (! printf "%s" "$command" >> "$3" ) 2> /dev/null 197c5e4114fSTom Zanussi grep "$1: error:" -A 3 error_log 198c5e4114fSTom Zanussi N=$(tail -n 1 error_log | wc -c) 199c5e4114fSTom Zanussi # " Command: " and "^\n" => 13 200c5e4114fSTom Zanussi test $(expr 13 + $pos) -eq $N 201c5e4114fSTom Zanussi} 2028b55572eSKalesh Singh 2038b55572eSKalesh Singh# Helper to get the tracefs mount point 2048b55572eSKalesh Singhget_mount_point() { 2058b55572eSKalesh Singh local mount_point=`stat -c '%m' .` 2068b55572eSKalesh Singh 2078b55572eSKalesh Singh # If stat -c '%m' does not work (e.g. busybox) or failed, try to use the 2088b55572eSKalesh Singh # current working directory (which should be a tracefs) as the mount point. 2098b55572eSKalesh Singh if [ ! -d "$mount_point" ]; then 2108b55572eSKalesh Singh if mount | grep -qw "$PWD"; then 2118b55572eSKalesh Singh mount_point=$PWD 2128b55572eSKalesh Singh else 2138b55572eSKalesh Singh # If PWD doesn't work, that is an environmental problem. 2148b55572eSKalesh Singh exit_unresolved 2158b55572eSKalesh Singh fi 2168b55572eSKalesh Singh fi 2178b55572eSKalesh Singh echo "$mount_point" 2188b55572eSKalesh Singh} 2198b55572eSKalesh Singh 2208b55572eSKalesh Singh# Helper function to retrieve mount options for a given mount point 2218b55572eSKalesh Singhget_mnt_options() { 2228b55572eSKalesh Singh local mnt_point="$1" 2238b55572eSKalesh Singh local opts=$(mount | grep -m1 "$mnt_point" | sed -e 's/.*(\(.*\)).*/\1/') 2248b55572eSKalesh Singh 2258b55572eSKalesh Singh echo "$opts" 2268b55572eSKalesh Singh}