#!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: ftrace - function pid filters # flags: instance # 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() { if [ $do_function_fork -eq 0 ]; then return fi echo $orig_value > trace_options } fail() { # msg do_reset echo $1 exit_fail } 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 do_reset exit 0