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

check_filter_file set_ftrace_filter

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
