Home | History | Annotate | Download | only in ftrace
      1 #!/bin/sh
      2 # SPDX-License-Identifier: GPL-2.0
      3 # description: ftrace - function pid filters
      4 
      5 # Make sure that function pid matching filter works.
      6 # Also test it on an instance directory
      7 
      8 if ! grep -q function available_tracers; then
      9     echo "no function tracer configured"
     10     exit_unsupported
     11 fi
     12 
     13 if [ ! -f set_ftrace_pid ]; then
     14     echo "set_ftrace_pid not found? Is function tracer not set?"
     15     exit_unsupported
     16 fi
     17 
     18 if [ ! -f set_ftrace_filter ]; then
     19     echo "set_ftrace_filter not found? Is function tracer not set?"
     20     exit_unsupported
     21 fi
     22 
     23 do_function_fork=1
     24 
     25 if [ ! -f options/function-fork ]; then
     26     do_function_fork=0
     27     echo "no option for function-fork found. Option will not be tested."
     28 fi
     29 
     30 read PID _ < /proc/self/stat
     31 
     32 if [ $do_function_fork -eq 1 ]; then
     33     # default value of function-fork option
     34     orig_value=`grep function-fork trace_options`
     35 fi
     36 
     37 do_reset() {
     38     reset_tracer
     39     clear_trace
     40     enable_tracing
     41     echo > set_ftrace_filter
     42     echo > set_ftrace_pid
     43 
     44     if [ $do_function_fork -eq 0 ]; then
     45 	return
     46     fi
     47 
     48     echo $orig_value > trace_options
     49 }
     50 
     51 fail() { # msg
     52     do_reset
     53     echo $1
     54     exit_fail
     55 }
     56 
     57 yield() {
     58     ping localhost -c 1 || sleep .001 || usleep 1 || sleep 1
     59 }
     60 
     61 do_test() {
     62     disable_tracing
     63 
     64     echo do_execve* > set_ftrace_filter
     65     echo *do_fork >> set_ftrace_filter
     66 
     67     echo $PID > set_ftrace_pid
     68     echo function > current_tracer
     69 
     70     if [ $do_function_fork -eq 1 ]; then
     71 	# don't allow children to be traced
     72 	echo nofunction-fork > trace_options
     73     fi
     74 
     75     enable_tracing
     76     yield
     77 
     78     count_pid=`cat trace | grep -v ^# | grep $PID | wc -l`
     79     count_other=`cat trace | grep -v ^# | grep -v $PID | wc -l`
     80 
     81     # count_other should be 0
     82     if [ $count_pid -eq 0 -o $count_other -ne 0 ]; then
     83 	fail "PID filtering not working?"
     84     fi
     85 
     86     disable_tracing
     87     clear_trace
     88 
     89     if [ $do_function_fork -eq 0 ]; then
     90 	return
     91     fi
     92 
     93     # allow children to be traced
     94     echo function-fork > trace_options
     95 
     96     enable_tracing
     97     yield
     98 
     99     count_pid=`cat trace | grep -v ^# | grep $PID | wc -l`
    100     count_other=`cat trace | grep -v ^# | grep -v $PID | wc -l`
    101 
    102     # count_other should NOT be 0
    103     if [ $count_pid -eq 0 -o $count_other -eq 0 ]; then
    104 	fail "PID filtering not following fork?"
    105     fi
    106 }
    107 
    108 do_test
    109 
    110 mkdir instances/foo
    111 cd instances/foo
    112 do_test
    113 cd ../../
    114 rmdir instances/foo
    115 
    116 do_reset
    117 
    118 exit 0
    119