#!/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
