Commit dc6bf4da authored by Steven Rostedt (VMware)'s avatar Steven Rostedt (VMware) Committed by Shuah Khan

selftests/ftrace: Use $FUNCTION_FORK to reference kernel fork function

Commit cad6967a ("fork: introduce kernel_clone()") replaced "_do_fork()"
with "kernel_clone()". The ftrace selftests reference the fork function in
several of the tests. The rename will make the tests break, but if those
names are changed in the tests, they would then break on older kernels. The
same set of tests should pass older kernels if they have previously passed.
Obviously, a new test may not work on older kernels if the test was added
due to a bug or a new feature.

The setup of ftracetest will now create a $FUNCTION_FORK bash variable
that will contain "_do_fork" for older kernels and "kernel_clone" for newer
ones. It figures out the proper name by examining /proc/kallsyms.

Note, available_filter_functions could also be used, but because some tests
should be able to pass without function tracing enabled, it could not be
used.

Fixes: eea11285 ("tracing: switch to kernel_clone()")
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Acked-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 3650b228
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
echo 0 > events/enable echo 0 > events/enable
echo > dynamic_events echo > dynamic_events
PLACE=kernel_clone PLACE=$FUNCTION_FORK
echo "p:myevent1 $PLACE" >> dynamic_events echo "p:myevent1 $PLACE" >> dynamic_events
echo "r:myevent2 $PLACE" >> dynamic_events echo "r:myevent2 $PLACE" >> dynamic_events
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
echo 0 > events/enable echo 0 > events/enable
echo > dynamic_events echo > dynamic_events
PLACE=kernel_clone PLACE=$FUNCTION_FORK
setup_events() { setup_events() {
echo "p:myevent1 $PLACE" >> dynamic_events echo "p:myevent1 $PLACE" >> dynamic_events
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
echo 0 > events/enable echo 0 > events/enable
echo > dynamic_events echo > dynamic_events
PLACE=kernel_clone PLACE=$FUNCTION_FORK
setup_events() { setup_events() {
echo "p:myevent1 $PLACE" >> dynamic_events echo "p:myevent1 $PLACE" >> dynamic_events
......
...@@ -39,7 +39,7 @@ do_test() { ...@@ -39,7 +39,7 @@ do_test() {
disable_tracing disable_tracing
echo do_execve* > set_ftrace_filter echo do_execve* > set_ftrace_filter
echo *do_fork >> set_ftrace_filter echo $FUNCTION_FORK >> set_ftrace_filter
echo $PID > set_ftrace_notrace_pid echo $PID > set_ftrace_notrace_pid
echo function > current_tracer echo function > current_tracer
......
...@@ -39,7 +39,7 @@ do_test() { ...@@ -39,7 +39,7 @@ do_test() {
disable_tracing disable_tracing
echo do_execve* > set_ftrace_filter echo do_execve* > set_ftrace_filter
echo *do_fork >> set_ftrace_filter echo $FUNCTION_FORK >> set_ftrace_filter
echo $PID > set_ftrace_pid echo $PID > set_ftrace_pid
echo function > current_tracer echo function > current_tracer
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
# requires: set_ftrace_filter # requires: set_ftrace_filter
# flags: instance # flags: instance
echo kernel_clone:stacktrace >> set_ftrace_filter echo $FUNCTION_FORK:stacktrace >> set_ftrace_filter
grep -q "kernel_clone:stacktrace:unlimited" set_ftrace_filter grep -q "$FUNCTION_FORK:stacktrace:unlimited" set_ftrace_filter
(echo "forked"; sleep 1) (echo "forked"; sleep 1)
......
...@@ -133,6 +133,13 @@ yield() { ...@@ -133,6 +133,13 @@ yield() {
ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1 ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1
} }
# The fork function in the kernel was renamed from "_do_fork" to
# "kernel_fork". As older tests should still work with older kernels
# as well as newer kernels, check which version of fork is used on this
# kernel so that the tests can use the fork function for the running kernel.
FUNCTION_FORK=`(if grep '\bkernel_clone\b' /proc/kallsyms > /dev/null; then
echo kernel_clone; else echo '_do_fork'; fi)`
# Since probe event command may include backslash, explicitly use printf "%s" # Since probe event command may include backslash, explicitly use printf "%s"
# to NOT interpret it. # to NOT interpret it.
ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# description: Kprobe dynamic event - adding and removing # description: Kprobe dynamic event - adding and removing
# requires: kprobe_events # requires: kprobe_events
echo p:myevent kernel_clone > kprobe_events echo p:myevent $FUNCTION_FORK > kprobe_events
grep myevent kprobe_events grep myevent kprobe_events
test -d events/kprobes/myevent test -d events/kprobes/myevent
echo > kprobe_events echo > kprobe_events
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# description: Kprobe dynamic event - busy event check # description: Kprobe dynamic event - busy event check
# requires: kprobe_events # requires: kprobe_events
echo p:myevent kernel_clone > kprobe_events echo p:myevent $FUNCTION_FORK > kprobe_events
test -d events/kprobes/myevent test -d events/kprobes/myevent
echo 1 > events/kprobes/myevent/enable echo 1 > events/kprobes/myevent/enable
echo > kprobe_events && exit_fail # this must fail echo > kprobe_events && exit_fail # this must fail
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
# description: Kprobe dynamic event with arguments # description: Kprobe dynamic event with arguments
# requires: kprobe_events # requires: kprobe_events
echo 'p:testprobe kernel_clone $stack $stack0 +0($stack)' > kprobe_events echo "p:testprobe $FUNCTION_FORK \$stack \$stack0 +0(\$stack)" > kprobe_events
grep testprobe kprobe_events | grep -q 'arg1=\$stack arg2=\$stack0 arg3=+0(\$stack)' grep testprobe kprobe_events | grep -q 'arg1=\$stack arg2=\$stack0 arg3=+0(\$stack)'
test -d events/kprobes/testprobe test -d events/kprobes/testprobe
echo 1 > events/kprobes/testprobe/enable echo 1 > events/kprobes/testprobe/enable
( echo "forked") ( echo "forked")
grep testprobe trace | grep 'kernel_clone' | \ grep testprobe trace | grep "$FUNCTION_FORK" | \
grep -q 'arg1=0x[[:xdigit:]]* arg2=0x[[:xdigit:]]* arg3=0x[[:xdigit:]]*$' grep -q 'arg1=0x[[:xdigit:]]* arg2=0x[[:xdigit:]]* arg3=0x[[:xdigit:]]*$'
echo 0 > events/kprobes/testprobe/enable echo 0 > events/kprobes/testprobe/enable
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
grep -A1 "fetcharg:" README | grep -q "\$comm" || exit_unsupported # this is too old grep -A1 "fetcharg:" README | grep -q "\$comm" || exit_unsupported # this is too old
echo 'p:testprobe kernel_clone comm=$comm ' > kprobe_events echo "p:testprobe $FUNCTION_FORK comm=\$comm " > kprobe_events
grep testprobe kprobe_events | grep -q 'comm=$comm' grep testprobe kprobe_events | grep -q 'comm=$comm'
test -d events/kprobes/testprobe test -d events/kprobes/testprobe
......
...@@ -30,13 +30,13 @@ esac ...@@ -30,13 +30,13 @@ esac
: "Test get argument (1)" : "Test get argument (1)"
echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string" > kprobe_events echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string" > kprobe_events
echo 1 > events/kprobes/testprobe/enable echo 1 > events/kprobes/testprobe/enable
echo "p:test kernel_clone" >> kprobe_events echo "p:test $FUNCTION_FORK" >> kprobe_events
grep -qe "testprobe.* arg1=\"test\"" trace grep -qe "testprobe.* arg1=\"test\"" trace
echo 0 > events/kprobes/testprobe/enable echo 0 > events/kprobes/testprobe/enable
: "Test get argument (2)" : "Test get argument (2)"
echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string arg2=+0(${ARG1}):string" > kprobe_events echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string arg2=+0(${ARG1}):string" > kprobe_events
echo 1 > events/kprobes/testprobe/enable echo 1 > events/kprobes/testprobe/enable
echo "p:test kernel_clone" >> kprobe_events echo "p:test $FUNCTION_FORK" >> kprobe_events
grep -qe "testprobe.* arg1=\"test\" arg2=\"test\"" trace grep -qe "testprobe.* arg1=\"test\" arg2=\"test\"" trace
...@@ -14,12 +14,12 @@ elif ! grep "$SYMBOL\$" /proc/kallsyms; then ...@@ -14,12 +14,12 @@ elif ! grep "$SYMBOL\$" /proc/kallsyms; then
fi fi
: "Test get basic types symbol argument" : "Test get basic types symbol argument"
echo "p:testprobe_u kernel_clone arg1=@linux_proc_banner:u64 arg2=@linux_proc_banner:u32 arg3=@linux_proc_banner:u16 arg4=@linux_proc_banner:u8" > kprobe_events echo "p:testprobe_u $FUNCTION_FORK arg1=@linux_proc_banner:u64 arg2=@linux_proc_banner:u32 arg3=@linux_proc_banner:u16 arg4=@linux_proc_banner:u8" > kprobe_events
echo "p:testprobe_s kernel_clone arg1=@linux_proc_banner:s64 arg2=@linux_proc_banner:s32 arg3=@linux_proc_banner:s16 arg4=@linux_proc_banner:s8" >> kprobe_events echo "p:testprobe_s $FUNCTION_FORK arg1=@linux_proc_banner:s64 arg2=@linux_proc_banner:s32 arg3=@linux_proc_banner:s16 arg4=@linux_proc_banner:s8" >> kprobe_events
if grep -q "x8/16/32/64" README; then if grep -q "x8/16/32/64" README; then
echo "p:testprobe_x kernel_clone arg1=@linux_proc_banner:x64 arg2=@linux_proc_banner:x32 arg3=@linux_proc_banner:x16 arg4=@linux_proc_banner:x8" >> kprobe_events echo "p:testprobe_x $FUNCTION_FORK arg1=@linux_proc_banner:x64 arg2=@linux_proc_banner:x32 arg3=@linux_proc_banner:x16 arg4=@linux_proc_banner:x8" >> kprobe_events
fi fi
echo "p:testprobe_bf kernel_clone arg1=@linux_proc_banner:b8@4/32" >> kprobe_events echo "p:testprobe_bf $FUNCTION_FORK arg1=@linux_proc_banner:b8@4/32" >> kprobe_events
echo 1 > events/kprobes/enable echo 1 > events/kprobes/enable
(echo "forked") (echo "forked")
echo 0 > events/kprobes/enable echo 0 > events/kprobes/enable
...@@ -27,7 +27,7 @@ grep "testprobe_[usx]:.* arg1=.* arg2=.* arg3=.* arg4=.*" trace ...@@ -27,7 +27,7 @@ grep "testprobe_[usx]:.* arg1=.* arg2=.* arg3=.* arg4=.*" trace
grep "testprobe_bf:.* arg1=.*" trace grep "testprobe_bf:.* arg1=.*" trace
: "Test get string symbol argument" : "Test get string symbol argument"
echo "p:testprobe_str kernel_clone arg1=@linux_proc_banner:string" > kprobe_events echo "p:testprobe_str $FUNCTION_FORK arg1=@linux_proc_banner:string" > kprobe_events
echo 1 > events/kprobes/enable echo 1 > events/kprobes/enable
(echo "forked") (echo "forked")
echo 0 > events/kprobes/enable echo 0 > events/kprobes/enable
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# requires: kprobe_events "x8/16/32/64":README # requires: kprobe_events "x8/16/32/64":README
gen_event() { # Bitsize gen_event() { # Bitsize
echo "p:testprobe kernel_clone \$stack0:s$1 \$stack0:u$1 \$stack0:x$1 \$stack0:b4@4/$1" echo "p:testprobe $FUNCTION_FORK \$stack0:s$1 \$stack0:u$1 \$stack0:x$1 \$stack0:b4@4/$1"
} }
check_types() { # s-type u-type x-type bf-type width check_types() { # s-type u-type x-type bf-type width
......
...@@ -5,29 +5,29 @@ ...@@ -5,29 +5,29 @@
# prepare # prepare
echo nop > current_tracer echo nop > current_tracer
echo kernel_clone > set_ftrace_filter echo $FUNCTION_FORK > set_ftrace_filter
echo 'p:testprobe kernel_clone' > kprobe_events echo "p:testprobe $FUNCTION_FORK" > kprobe_events
# kprobe on / ftrace off # kprobe on / ftrace off
echo 1 > events/kprobes/testprobe/enable echo 1 > events/kprobes/testprobe/enable
echo > trace echo > trace
( echo "forked") ( echo "forked")
grep testprobe trace grep testprobe trace
! grep 'kernel_clone <-' trace ! grep "$FUNCTION_FORK <-" trace
# kprobe on / ftrace on # kprobe on / ftrace on
echo function > current_tracer echo function > current_tracer
echo > trace echo > trace
( echo "forked") ( echo "forked")
grep testprobe trace grep testprobe trace
grep 'kernel_clone <-' trace grep "$FUNCTION_FORK <-" trace
# kprobe off / ftrace on # kprobe off / ftrace on
echo 0 > events/kprobes/testprobe/enable echo 0 > events/kprobes/testprobe/enable
echo > trace echo > trace
( echo "forked") ( echo "forked")
! grep testprobe trace ! grep testprobe trace
grep 'kernel_clone <-' trace grep "$FUNCTION_FORK <-" trace
# kprobe on / ftrace on # kprobe on / ftrace on
echo 1 > events/kprobes/testprobe/enable echo 1 > events/kprobes/testprobe/enable
...@@ -35,11 +35,11 @@ echo function > current_tracer ...@@ -35,11 +35,11 @@ echo function > current_tracer
echo > trace echo > trace
( echo "forked") ( echo "forked")
grep testprobe trace grep testprobe trace
grep 'kernel_clone <-' trace grep "$FUNCTION_FORK <-" trace
# kprobe on / ftrace off # kprobe on / ftrace off
echo nop > current_tracer echo nop > current_tracer
echo > trace echo > trace
( echo "forked") ( echo "forked")
grep testprobe trace grep testprobe trace
! grep 'kernel_clone <-' trace ! grep "$FUNCTION_FORK <-" trace
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# requires: kprobe_events "Create/append/":README # requires: kprobe_events "Create/append/":README
# Choose 2 symbols for target # Choose 2 symbols for target
SYM1=kernel_clone SYM1=$FUNCTION_FORK
SYM2=do_exit SYM2=do_exit
EVENT_NAME=kprobes/testevent EVENT_NAME=kprobes/testevent
......
...@@ -86,15 +86,15 @@ esac ...@@ -86,15 +86,15 @@ esac
# multiprobe errors # multiprobe errors
if grep -q "Create/append/" README && grep -q "imm-value" README; then if grep -q "Create/append/" README && grep -q "imm-value" README; then
echo 'p:kprobes/testevent kernel_clone' > kprobe_events echo "p:kprobes/testevent $FUNCTION_FORK" > kprobe_events
check_error '^r:kprobes/testevent do_exit' # DIFF_PROBE_TYPE check_error '^r:kprobes/testevent do_exit' # DIFF_PROBE_TYPE
# Explicitly use printf "%s" to not interpret \1 # Explicitly use printf "%s" to not interpret \1
printf "%s" 'p:kprobes/testevent kernel_clone abcd=\1' > kprobe_events printf "%s" "p:kprobes/testevent $FUNCTION_FORK abcd=\\1" > kprobe_events
check_error 'p:kprobes/testevent kernel_clone ^bcd=\1' # DIFF_ARG_TYPE check_error "p:kprobes/testevent $FUNCTION_FORK ^bcd=\\1" # DIFF_ARG_TYPE
check_error 'p:kprobes/testevent kernel_clone ^abcd=\1:u8' # DIFF_ARG_TYPE check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8" # DIFF_ARG_TYPE
check_error 'p:kprobes/testevent kernel_clone ^abcd=\"foo"' # DIFF_ARG_TYPE check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE
check_error '^p:kprobes/testevent kernel_clone abcd=\1' # SAME_PROBE check_error "^p:kprobes/testevent $FUNCTION_FORK abcd=\\1" # SAME_PROBE
fi fi
# %return suffix errors # %return suffix errors
......
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
# requires: kprobe_events # requires: kprobe_events
# Add new kretprobe event # Add new kretprobe event
echo 'r:testprobe2 kernel_clone $retval' > kprobe_events echo "r:testprobe2 $FUNCTION_FORK \$retval" > kprobe_events
grep testprobe2 kprobe_events | grep -q 'arg1=\$retval' grep testprobe2 kprobe_events | grep -q 'arg1=\$retval'
test -d events/kprobes/testprobe2 test -d events/kprobes/testprobe2
echo 1 > events/kprobes/testprobe2/enable echo 1 > events/kprobes/testprobe2/enable
( echo "forked") ( echo "forked")
cat trace | grep testprobe2 | grep -q '<- kernel_clone' cat trace | grep testprobe2 | grep -q "<- $FUNCTION_FORK"
echo 0 > events/kprobes/testprobe2/enable echo 0 > events/kprobes/testprobe2/enable
echo '-:testprobe2' >> kprobe_events echo '-:testprobe2' >> kprobe_events
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# requires: kprobe_events # requires: kprobe_events
! grep -q 'myevent' kprobe_profile ! grep -q 'myevent' kprobe_profile
echo p:myevent kernel_clone > kprobe_events echo "p:myevent $FUNCTION_FORK" > kprobe_events
grep -q 'myevent[[:space:]]*0[[:space:]]*0$' kprobe_profile grep -q 'myevent[[:space:]]*0[[:space:]]*0$' kprobe_profile
echo 1 > events/kprobes/myevent/enable echo 1 > events/kprobes/myevent/enable
( echo "forked" ) ( echo "forked" )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment