Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Commit cad6967ac108 ("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: eea11285dab3 ("tracing: switch to kernel_clone()")
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Steven Rostedt (VMware) and committed by
Shuah Khan
dc6bf4da 3650b228

+44 -37
+1 -1
tools/testing/selftests/ftrace/test.d/dynevent/add_remove_kprobe.tc
··· 6 6 echo 0 > events/enable 7 7 echo > dynamic_events 8 8 9 - PLACE=kernel_clone 9 + PLACE=$FUNCTION_FORK 10 10 11 11 echo "p:myevent1 $PLACE" >> dynamic_events 12 12 echo "r:myevent2 $PLACE" >> dynamic_events
+1 -1
tools/testing/selftests/ftrace/test.d/dynevent/clear_select_events.tc
··· 6 6 echo 0 > events/enable 7 7 echo > dynamic_events 8 8 9 - PLACE=kernel_clone 9 + PLACE=$FUNCTION_FORK 10 10 11 11 setup_events() { 12 12 echo "p:myevent1 $PLACE" >> dynamic_events
+1 -1
tools/testing/selftests/ftrace/test.d/dynevent/generic_clear_event.tc
··· 6 6 echo 0 > events/enable 7 7 echo > dynamic_events 8 8 9 - PLACE=kernel_clone 9 + PLACE=$FUNCTION_FORK 10 10 11 11 setup_events() { 12 12 echo "p:myevent1 $PLACE" >> dynamic_events
+1 -1
tools/testing/selftests/ftrace/test.d/ftrace/func-filter-notrace-pid.tc
··· 39 39 disable_tracing 40 40 41 41 echo do_execve* > set_ftrace_filter 42 - echo *do_fork >> set_ftrace_filter 42 + echo $FUNCTION_FORK >> set_ftrace_filter 43 43 44 44 echo $PID > set_ftrace_notrace_pid 45 45 echo function > current_tracer
+1 -1
tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc
··· 39 39 disable_tracing 40 40 41 41 echo do_execve* > set_ftrace_filter 42 - echo *do_fork >> set_ftrace_filter 42 + echo $FUNCTION_FORK >> set_ftrace_filter 43 43 44 44 echo $PID > set_ftrace_pid 45 45 echo function > current_tracer
+2 -2
tools/testing/selftests/ftrace/test.d/ftrace/func-filter-stacktrace.tc
··· 4 4 # requires: set_ftrace_filter 5 5 # flags: instance 6 6 7 - echo kernel_clone:stacktrace >> set_ftrace_filter 7 + echo $FUNCTION_FORK:stacktrace >> set_ftrace_filter 8 8 9 - grep -q "kernel_clone:stacktrace:unlimited" set_ftrace_filter 9 + grep -q "$FUNCTION_FORK:stacktrace:unlimited" set_ftrace_filter 10 10 11 11 (echo "forked"; sleep 1) 12 12
+7
tools/testing/selftests/ftrace/test.d/functions
··· 133 133 ping $LOCALHOST -c 1 || sleep .001 || usleep 1 || sleep 1 134 134 } 135 135 136 + # The fork function in the kernel was renamed from "_do_fork" to 137 + # "kernel_fork". As older tests should still work with older kernels 138 + # as well as newer kernels, check which version of fork is used on this 139 + # kernel so that the tests can use the fork function for the running kernel. 140 + FUNCTION_FORK=`(if grep '\bkernel_clone\b' /proc/kallsyms > /dev/null; then 141 + echo kernel_clone; else echo '_do_fork'; fi)` 142 + 136 143 # Since probe event command may include backslash, explicitly use printf "%s" 137 144 # to NOT interpret it. 138 145 ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc
··· 3 3 # description: Kprobe dynamic event - adding and removing 4 4 # requires: kprobe_events 5 5 6 - echo p:myevent kernel_clone > kprobe_events 6 + echo p:myevent $FUNCTION_FORK > kprobe_events 7 7 grep myevent kprobe_events 8 8 test -d events/kprobes/myevent 9 9 echo > kprobe_events
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc
··· 3 3 # description: Kprobe dynamic event - busy event check 4 4 # requires: kprobe_events 5 5 6 - echo p:myevent kernel_clone > kprobe_events 6 + echo p:myevent $FUNCTION_FORK > kprobe_events 7 7 test -d events/kprobes/myevent 8 8 echo 1 > events/kprobes/myevent/enable 9 9 echo > kprobe_events && exit_fail # this must fail
+2 -2
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc
··· 3 3 # description: Kprobe dynamic event with arguments 4 4 # requires: kprobe_events 5 5 6 - echo 'p:testprobe kernel_clone $stack $stack0 +0($stack)' > kprobe_events 6 + echo "p:testprobe $FUNCTION_FORK \$stack \$stack0 +0(\$stack)" > kprobe_events 7 7 grep testprobe kprobe_events | grep -q 'arg1=\$stack arg2=\$stack0 arg3=+0(\$stack)' 8 8 test -d events/kprobes/testprobe 9 9 10 10 echo 1 > events/kprobes/testprobe/enable 11 11 ( echo "forked") 12 - grep testprobe trace | grep 'kernel_clone' | \ 12 + grep testprobe trace | grep "$FUNCTION_FORK" | \ 13 13 grep -q 'arg1=0x[[:xdigit:]]* arg2=0x[[:xdigit:]]* arg3=0x[[:xdigit:]]*$' 14 14 15 15 echo 0 > events/kprobes/testprobe/enable
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_comm.tc
··· 5 5 6 6 grep -A1 "fetcharg:" README | grep -q "\$comm" || exit_unsupported # this is too old 7 7 8 - echo 'p:testprobe kernel_clone comm=$comm ' > kprobe_events 8 + echo "p:testprobe $FUNCTION_FORK comm=\$comm " > kprobe_events 9 9 grep testprobe kprobe_events | grep -q 'comm=$comm' 10 10 test -d events/kprobes/testprobe 11 11
+2 -2
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc
··· 30 30 : "Test get argument (1)" 31 31 echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string" > kprobe_events 32 32 echo 1 > events/kprobes/testprobe/enable 33 - echo "p:test kernel_clone" >> kprobe_events 33 + echo "p:test $FUNCTION_FORK" >> kprobe_events 34 34 grep -qe "testprobe.* arg1=\"test\"" trace 35 35 36 36 echo 0 > events/kprobes/testprobe/enable 37 37 : "Test get argument (2)" 38 38 echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string arg2=+0(${ARG1}):string" > kprobe_events 39 39 echo 1 > events/kprobes/testprobe/enable 40 - echo "p:test kernel_clone" >> kprobe_events 40 + echo "p:test $FUNCTION_FORK" >> kprobe_events 41 41 grep -qe "testprobe.* arg1=\"test\" arg2=\"test\"" trace 42 42
+5 -5
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_symbol.tc
··· 14 14 fi 15 15 16 16 : "Test get basic types symbol argument" 17 - 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 18 - 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 17 + 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 18 + 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 19 19 if grep -q "x8/16/32/64" README; then 20 - 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 20 + 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 21 21 fi 22 - echo "p:testprobe_bf kernel_clone arg1=@linux_proc_banner:b8@4/32" >> kprobe_events 22 + echo "p:testprobe_bf $FUNCTION_FORK arg1=@linux_proc_banner:b8@4/32" >> kprobe_events 23 23 echo 1 > events/kprobes/enable 24 24 (echo "forked") 25 25 echo 0 > events/kprobes/enable ··· 27 27 grep "testprobe_bf:.* arg1=.*" trace 28 28 29 29 : "Test get string symbol argument" 30 - echo "p:testprobe_str kernel_clone arg1=@linux_proc_banner:string" > kprobe_events 30 + echo "p:testprobe_str $FUNCTION_FORK arg1=@linux_proc_banner:string" > kprobe_events 31 31 echo 1 > events/kprobes/enable 32 32 (echo "forked") 33 33 echo 0 > events/kprobes/enable
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc
··· 4 4 # requires: kprobe_events "x8/16/32/64":README 5 5 6 6 gen_event() { # Bitsize 7 - echo "p:testprobe kernel_clone \$stack0:s$1 \$stack0:u$1 \$stack0:x$1 \$stack0:b4@4/$1" 7 + echo "p:testprobe $FUNCTION_FORK \$stack0:s$1 \$stack0:u$1 \$stack0:x$1 \$stack0:b4@4/$1" 8 8 } 9 9 10 10 check_types() { # s-type u-type x-type bf-type width
+7 -7
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc
··· 5 5 6 6 # prepare 7 7 echo nop > current_tracer 8 - echo kernel_clone > set_ftrace_filter 9 - echo 'p:testprobe kernel_clone' > kprobe_events 8 + echo $FUNCTION_FORK > set_ftrace_filter 9 + echo "p:testprobe $FUNCTION_FORK" > kprobe_events 10 10 11 11 # kprobe on / ftrace off 12 12 echo 1 > events/kprobes/testprobe/enable 13 13 echo > trace 14 14 ( echo "forked") 15 15 grep testprobe trace 16 - ! grep 'kernel_clone <-' trace 16 + ! grep "$FUNCTION_FORK <-" trace 17 17 18 18 # kprobe on / ftrace on 19 19 echo function > current_tracer 20 20 echo > trace 21 21 ( echo "forked") 22 22 grep testprobe trace 23 - grep 'kernel_clone <-' trace 23 + grep "$FUNCTION_FORK <-" trace 24 24 25 25 # kprobe off / ftrace on 26 26 echo 0 > events/kprobes/testprobe/enable 27 27 echo > trace 28 28 ( echo "forked") 29 29 ! grep testprobe trace 30 - grep 'kernel_clone <-' trace 30 + grep "$FUNCTION_FORK <-" trace 31 31 32 32 # kprobe on / ftrace on 33 33 echo 1 > events/kprobes/testprobe/enable ··· 35 35 echo > trace 36 36 ( echo "forked") 37 37 grep testprobe trace 38 - grep 'kernel_clone <-' trace 38 + grep "$FUNCTION_FORK <-" trace 39 39 40 40 # kprobe on / ftrace off 41 41 echo nop > current_tracer 42 42 echo > trace 43 43 ( echo "forked") 44 44 grep testprobe trace 45 - ! grep 'kernel_clone <-' trace 45 + ! grep "$FUNCTION_FORK <-" trace
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_multiprobe.tc
··· 4 4 # requires: kprobe_events "Create/append/":README 5 5 6 6 # Choose 2 symbols for target 7 - SYM1=kernel_clone 7 + SYM1=$FUNCTION_FORK 8 8 SYM2=do_exit 9 9 EVENT_NAME=kprobes/testevent 10 10
+6 -6
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc
··· 86 86 87 87 # multiprobe errors 88 88 if grep -q "Create/append/" README && grep -q "imm-value" README; then 89 - echo 'p:kprobes/testevent kernel_clone' > kprobe_events 89 + echo "p:kprobes/testevent $FUNCTION_FORK" > kprobe_events 90 90 check_error '^r:kprobes/testevent do_exit' # DIFF_PROBE_TYPE 91 91 92 92 # Explicitly use printf "%s" to not interpret \1 93 - printf "%s" 'p:kprobes/testevent kernel_clone abcd=\1' > kprobe_events 94 - check_error 'p:kprobes/testevent kernel_clone ^bcd=\1' # DIFF_ARG_TYPE 95 - check_error 'p:kprobes/testevent kernel_clone ^abcd=\1:u8' # DIFF_ARG_TYPE 96 - check_error 'p:kprobes/testevent kernel_clone ^abcd=\"foo"' # DIFF_ARG_TYPE 97 - check_error '^p:kprobes/testevent kernel_clone abcd=\1' # SAME_PROBE 93 + printf "%s" "p:kprobes/testevent $FUNCTION_FORK abcd=\\1" > kprobe_events 94 + check_error "p:kprobes/testevent $FUNCTION_FORK ^bcd=\\1" # DIFF_ARG_TYPE 95 + check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8" # DIFF_ARG_TYPE 96 + check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE 97 + check_error "^p:kprobes/testevent $FUNCTION_FORK abcd=\\1" # SAME_PROBE 98 98 fi 99 99 100 100 # %return suffix errors
+2 -2
tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc
··· 4 4 # requires: kprobe_events 5 5 6 6 # Add new kretprobe event 7 - echo 'r:testprobe2 kernel_clone $retval' > kprobe_events 7 + echo "r:testprobe2 $FUNCTION_FORK \$retval" > kprobe_events 8 8 grep testprobe2 kprobe_events | grep -q 'arg1=\$retval' 9 9 test -d events/kprobes/testprobe2 10 10 11 11 echo 1 > events/kprobes/testprobe2/enable 12 12 ( echo "forked") 13 13 14 - cat trace | grep testprobe2 | grep -q '<- kernel_clone' 14 + cat trace | grep testprobe2 | grep -q "<- $FUNCTION_FORK" 15 15 16 16 echo 0 > events/kprobes/testprobe2/enable 17 17 echo '-:testprobe2' >> kprobe_events
+1 -1
tools/testing/selftests/ftrace/test.d/kprobe/profile.tc
··· 4 4 # requires: kprobe_events 5 5 6 6 ! grep -q 'myevent' kprobe_profile 7 - echo p:myevent kernel_clone > kprobe_events 7 + echo "p:myevent $FUNCTION_FORK" > kprobe_events 8 8 grep -q 'myevent[[:space:]]*0[[:space:]]*0$' kprobe_profile 9 9 echo 1 > events/kprobes/myevent/enable 10 10 ( echo "forked" )