|
@@ -0,0 +1,117 @@
|
|
|
+#!/bin/sh
|
|
|
+# description: ftrace - function pid filters
|
|
|
+
|
|
|
+# Make sure that function pid matching filter works.
|
|
|
+# Also test it on an instance directory
|
|
|
+
|
|
|
+if ! grep -q function available_tracers; then
|
|
|
+ echo "no function tracer configured"
|
|
|
+ exit_unsupported
|
|
|
+fi
|
|
|
+
|
|
|
+if [ ! -f set_ftrace_pid ]; then
|
|
|
+ echo "set_ftrace_pid not found? Is function tracer not set?"
|
|
|
+ exit_unsupported
|
|
|
+fi
|
|
|
+
|
|
|
+if [ ! -f set_ftrace_filter ]; then
|
|
|
+ echo "set_ftrace_filter not found? Is function tracer not set?"
|
|
|
+ exit_unsupported
|
|
|
+fi
|
|
|
+
|
|
|
+do_function_fork=1
|
|
|
+
|
|
|
+if [ ! -f options/function-fork ]; then
|
|
|
+ do_function_fork=0
|
|
|
+ echo "no option for function-fork found. Option will not be tested."
|
|
|
+fi
|
|
|
+
|
|
|
+read PID _ < /proc/self/stat
|
|
|
+
|
|
|
+if [ $do_function_fork -eq 1 ]; then
|
|
|
+ # default value of function-fork option
|
|
|
+ orig_value=`grep function-fork trace_options`
|
|
|
+fi
|
|
|
+
|
|
|
+do_reset() {
|
|
|
+ reset_tracer
|
|
|
+ clear_trace
|
|
|
+ enable_tracing
|
|
|
+ echo > set_ftrace_filter
|
|
|
+ echo > set_ftrace_pid
|
|
|
+
|
|
|
+ if [ $do_function_fork -eq 0 ]; then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo $orig_value > trace_options
|
|
|
+}
|
|
|
+
|
|
|
+fail() { # msg
|
|
|
+ do_reset
|
|
|
+ echo $1
|
|
|
+ exit $FAIL
|
|
|
+}
|
|
|
+
|
|
|
+yield() {
|
|
|
+ ping localhost -c 1 || sleep .001 || usleep 1 || sleep 1
|
|
|
+}
|
|
|
+
|
|
|
+do_test() {
|
|
|
+ disable_tracing
|
|
|
+
|
|
|
+ echo do_execve* > set_ftrace_filter
|
|
|
+ echo *do_fork >> set_ftrace_filter
|
|
|
+
|
|
|
+ echo $PID > set_ftrace_pid
|
|
|
+ echo function > current_tracer
|
|
|
+
|
|
|
+ if [ $do_function_fork -eq 1 ]; then
|
|
|
+ # don't allow children to be traced
|
|
|
+ echo nofunction-fork > trace_options
|
|
|
+ fi
|
|
|
+
|
|
|
+ enable_tracing
|
|
|
+ yield
|
|
|
+
|
|
|
+ count_pid=`cat trace | grep -v ^# | grep $PID | wc -l`
|
|
|
+ count_other=`cat trace | grep -v ^# | grep -v $PID | wc -l`
|
|
|
+
|
|
|
+ # count_other should be 0
|
|
|
+ if [ $count_pid -eq 0 -o $count_other -ne 0 ]; then
|
|
|
+ fail "PID filtering not working?"
|
|
|
+ fi
|
|
|
+
|
|
|
+ disable_tracing
|
|
|
+ clear_trace
|
|
|
+
|
|
|
+ if [ $do_function_fork -eq 0 ]; then
|
|
|
+ return
|
|
|
+ fi
|
|
|
+
|
|
|
+ # allow children to be traced
|
|
|
+ echo function-fork > trace_options
|
|
|
+
|
|
|
+ enable_tracing
|
|
|
+ yield
|
|
|
+
|
|
|
+ count_pid=`cat trace | grep -v ^# | grep $PID | wc -l`
|
|
|
+ count_other=`cat trace | grep -v ^# | grep -v $PID | wc -l`
|
|
|
+
|
|
|
+ # count_other should NOT be 0
|
|
|
+ if [ $count_pid -eq 0 -o $count_other -eq 0 ]; then
|
|
|
+ fail "PID filtering not following fork?"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+do_test
|
|
|
+
|
|
|
+mkdir instances/foo
|
|
|
+cd instances/foo
|
|
|
+do_test
|
|
|
+cd ../../
|
|
|
+rmdir instances/foo
|
|
|
+
|
|
|
+do_reset
|
|
|
+
|
|
|
+exit 0
|