Skip to content

Commit

Permalink
Merge tag 'trace-v4.11-rc5-4' of git://git.kernel.org/pub/scm/linux/k…
Browse files Browse the repository at this point in the history
…ernel/git/rostedt/linux-trace

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
  • Loading branch information
Linus Torvalds committed Apr 18, 2017
2 parents 0bad6d7 + 9ed19c7 commit fb5e215
Showing 1 changed file with 117 additions and 0 deletions.
117 changes: 117 additions & 0 deletions tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/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

0 comments on commit fb5e215

Please sign in to comment.