Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb5e2154 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ftrace testcase update from Steven Rostedt:
 "While testing my development branch, without the fix for the pid use
  after free bug, the selftest that Namhyung added triggers it. I
  figured it would be good to add the test for the bug after the fix,
  such that it does not exist without the fix.

  I added another patch that lets the test only test part of the pid
  filtering, and ignores the function-fork (filtering on children as
  well) if the function-fork feature does not exist. This feature is
  added by Namhyung just before he added this test. But since the test
  tests both with and without the feature, it would be good to let it
  not fail if the feature does not exist"

* tag 'trace-v4.11-rc5-4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  selftests: ftrace: Add check for function-fork before running pid filter test
  selftests: ftrace: Add a testcase for function PID filter
parents 0bad6d7e 9ed19c76
Loading
Loading
Loading
Loading
+117 −0
Original line number Diff line number Diff line
#!/bin/sh
# 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