| #!/bin/sh |
| # SPDX-License-Identifier: GPL-2.0 |
| # 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 |