Skip to content

Commit

Permalink
selftests/ftrace: Use $FUNCTION_FORK to reference kernel fork function
Browse files Browse the repository at this point in the history
Commit cad6967 ("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: eea1128 ("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>
  • Loading branch information
Steven Rostedt (VMware) authored and Shuah Khan committed Oct 27, 2020
1 parent 3650b22 commit dc6bf4d
Showing 19 changed files with 44 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@
echo 0 > events/enable
echo > dynamic_events

PLACE=kernel_clone
PLACE=$FUNCTION_FORK

echo "p:myevent1 $PLACE" >> dynamic_events
echo "r:myevent2 $PLACE" >> dynamic_events
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@
echo 0 > events/enable
echo > dynamic_events

PLACE=kernel_clone
PLACE=$FUNCTION_FORK

setup_events() {
echo "p:myevent1 $PLACE" >> dynamic_events
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@
echo 0 > events/enable
echo > dynamic_events

PLACE=kernel_clone
PLACE=$FUNCTION_FORK

setup_events() {
echo "p:myevent1 $PLACE" >> dynamic_events
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ do_test() {
disable_tracing

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 function > current_tracer
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ do_test() {
disable_tracing

echo do_execve* > set_ftrace_filter
echo *do_fork >> set_ftrace_filter
echo $FUNCTION_FORK >> set_ftrace_filter

echo $PID > set_ftrace_pid
echo function > current_tracer
Original file line number Diff line number Diff line change
@@ -4,9 +4,9 @@
# requires: set_ftrace_filter
# 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)

7 changes: 7 additions & 0 deletions tools/testing/selftests/ftrace/test.d/functions
Original file line number Diff line number Diff line change
@@ -133,6 +133,13 @@ yield() {
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"
# to NOT interpret it.
ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
# description: Kprobe dynamic event - adding and removing
# requires: kprobe_events

echo p:myevent kernel_clone > kprobe_events
echo p:myevent $FUNCTION_FORK > kprobe_events
grep myevent kprobe_events
test -d events/kprobes/myevent
echo > kprobe_events
2 changes: 1 addition & 1 deletion tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
# description: Kprobe dynamic event - busy event check
# requires: kprobe_events

echo p:myevent kernel_clone > kprobe_events
echo p:myevent $FUNCTION_FORK > kprobe_events
test -d events/kprobes/myevent
echo 1 > events/kprobes/myevent/enable
echo > kprobe_events && exit_fail # this must fail
4 changes: 2 additions & 2 deletions tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc
Original file line number Diff line number Diff line change
@@ -3,13 +3,13 @@
# description: Kprobe dynamic event with arguments
# 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)'
test -d events/kprobes/testprobe

echo 1 > events/kprobes/testprobe/enable
( 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:]]*$'

echo 0 > events/kprobes/testprobe/enable
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@

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'
test -d events/kprobes/testprobe

Original file line number Diff line number Diff line change
@@ -30,13 +30,13 @@ esac
: "Test get argument (1)"
echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string" > kprobe_events
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

echo 0 > events/kprobes/testprobe/enable
: "Test get argument (2)"
echo "p:testprobe tracefs_create_dir arg1=+0(${ARG1}):string arg2=+0(${ARG1}):string" > kprobe_events
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

Original file line number Diff line number Diff line change
@@ -14,20 +14,20 @@ elif ! grep "$SYMBOL\$" /proc/kallsyms; then
fi

: "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_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_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 $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
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
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 "forked")
echo 0 > events/kprobes/enable
grep "testprobe_[usx]:.* arg1=.* arg2=.* arg3=.* arg4=.*" trace
grep "testprobe_bf:.* arg1=.*" trace

: "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 "forked")
echo 0 > events/kprobes/enable
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
# requires: kprobe_events "x8/16/32/64":README

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
14 changes: 7 additions & 7 deletions tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc
Original file line number Diff line number Diff line change
@@ -5,41 +5,41 @@

# prepare
echo nop > current_tracer
echo kernel_clone > set_ftrace_filter
echo 'p:testprobe kernel_clone' > kprobe_events
echo $FUNCTION_FORK > set_ftrace_filter
echo "p:testprobe $FUNCTION_FORK" > kprobe_events

# kprobe on / ftrace off
echo 1 > events/kprobes/testprobe/enable
echo > trace
( echo "forked")
grep testprobe trace
! grep 'kernel_clone <-' trace
! grep "$FUNCTION_FORK <-" trace

# kprobe on / ftrace on
echo function > current_tracer
echo > trace
( echo "forked")
grep testprobe trace
grep 'kernel_clone <-' trace
grep "$FUNCTION_FORK <-" trace

# kprobe off / ftrace on
echo 0 > events/kprobes/testprobe/enable
echo > trace
( echo "forked")
! grep testprobe trace
grep 'kernel_clone <-' trace
grep "$FUNCTION_FORK <-" trace

# kprobe on / ftrace on
echo 1 > events/kprobes/testprobe/enable
echo function > current_tracer
echo > trace
( echo "forked")
grep testprobe trace
grep 'kernel_clone <-' trace
grep "$FUNCTION_FORK <-" trace

# kprobe on / ftrace off
echo nop > current_tracer
echo > trace
( echo "forked")
grep testprobe trace
! grep 'kernel_clone <-' trace
! grep "$FUNCTION_FORK <-" trace
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
# requires: kprobe_events "Create/append/":README

# Choose 2 symbols for target
SYM1=kernel_clone
SYM1=$FUNCTION_FORK
SYM2=do_exit
EVENT_NAME=kprobes/testevent

Original file line number Diff line number Diff line change
@@ -86,15 +86,15 @@ esac

# multiprobe errors
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

# Explicitly use printf "%s" to not interpret \1
printf "%s" 'p:kprobes/testevent kernel_clone abcd=\1' > kprobe_events
check_error 'p:kprobes/testevent kernel_clone ^bcd=\1' # DIFF_ARG_TYPE
check_error 'p:kprobes/testevent kernel_clone ^abcd=\1:u8' # DIFF_ARG_TYPE
check_error 'p:kprobes/testevent kernel_clone ^abcd=\"foo"' # DIFF_ARG_TYPE
check_error '^p:kprobes/testevent kernel_clone abcd=\1' # SAME_PROBE
printf "%s" "p:kprobes/testevent $FUNCTION_FORK abcd=\\1" > kprobe_events
check_error "p:kprobes/testevent $FUNCTION_FORK ^bcd=\\1" # DIFF_ARG_TYPE
check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8" # DIFF_ARG_TYPE
check_error "p:kprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE
check_error "^p:kprobes/testevent $FUNCTION_FORK abcd=\\1" # SAME_PROBE
fi

# %return suffix errors
Original file line number Diff line number Diff line change
@@ -4,14 +4,14 @@
# requires: kprobe_events

# 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'
test -d events/kprobes/testprobe2

echo 1 > events/kprobes/testprobe2/enable
( 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 '-:testprobe2' >> kprobe_events
2 changes: 1 addition & 1 deletion tools/testing/selftests/ftrace/test.d/kprobe/profile.tc
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
# requires: kprobe_events

! 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
echo 1 > events/kprobes/myevent/enable
( echo "forked" )

0 comments on commit dc6bf4d

Please sign in to comment.