-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/ftrace: Add fprobe related testcases
Add syntax error testcase and add-remove testcase for fprobe events. This ensures that the fprobe events can be added/removed and parser handles syntax errors correctly. Link: https://lore.kernel.org/all/168507470812.913472.7489900116963294042.stgit@mhiramat.roam.corp.google.com/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
- Loading branch information
Masami Hiramatsu (Google)
committed
Jun 6, 2023
1 parent
334e551
commit 4d42a76
Showing
2 changed files
with
123 additions
and
0 deletions.
There are no files selected for viewing
26 changes: 26 additions & 0 deletions
26
tools/testing/selftests/ftrace/test.d/dynevent/add_remove_fprobe.tc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# description: Generic dynamic event - add/remove fprobe events | ||
# requires: dynamic_events "f[:[<group>/][<event>]] <func-name>[%return] [<args>]": README | ||
|
||
echo 0 > events/enable | ||
echo > dynamic_events | ||
|
||
PLACE=$FUNCTION_FORK | ||
|
||
echo "f:myevent1 $PLACE" >> dynamic_events | ||
echo "f:myevent2 $PLACE%return" >> dynamic_events | ||
|
||
grep -q myevent1 dynamic_events | ||
grep -q myevent2 dynamic_events | ||
test -d events/fprobes/myevent1 | ||
test -d events/fprobes/myevent2 | ||
|
||
echo "-:myevent2" >> dynamic_events | ||
|
||
grep -q myevent1 dynamic_events | ||
! grep -q myevent2 dynamic_events | ||
|
||
echo > dynamic_events | ||
|
||
clear_trace |
97 changes: 97 additions & 0 deletions
97
tools/testing/selftests/ftrace/test.d/dynevent/fprobe_syntax_errors.tc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# description: Fprobe event parser error log check | ||
# requires: dynamic_events "f[:[<group>/][<event>]] <func-name>[%return] [<args>]": README | ||
|
||
check_error() { # command-with-error-pos-by-^ | ||
ftrace_errlog_check 'trace_fprobe' "$1" 'dynamic_events' | ||
} | ||
|
||
case `uname -m` in | ||
x86_64|i[3456]86) | ||
REG=%ax ;; | ||
aarch64) | ||
REG=%x0 ;; | ||
*) | ||
REG=%r0 ;; | ||
esac | ||
|
||
check_error 'f^100 vfs_read' # MAXACT_NO_KPROBE | ||
check_error 'f^1a111 vfs_read' # BAD_MAXACT | ||
check_error 'f^100000 vfs_read' # MAXACT_TOO_BIG | ||
|
||
check_error 'f ^non_exist_func' # BAD_PROBE_ADDR (enoent) | ||
check_error 'f ^vfs_read+10' # BAD_PROBE_ADDR | ||
check_error 'f:^/bar vfs_read' # NO_GROUP_NAME | ||
check_error 'f:^12345678901234567890123456789012345678901234567890123456789012345/bar vfs_read' # GROUP_TOO_LONG | ||
|
||
check_error 'f:^foo.1/bar vfs_read' # BAD_GROUP_NAME | ||
check_error 'f:^ vfs_read' # NO_EVENT_NAME | ||
check_error 'f:foo/^12345678901234567890123456789012345678901234567890123456789012345 vfs_read' # EVENT_TOO_LONG | ||
check_error 'f:foo/^bar.1 vfs_read' # BAD_EVENT_NAME | ||
|
||
check_error 'f vfs_read ^$retval' # RETVAL_ON_PROBE | ||
check_error 'f vfs_read ^$stack10000' # BAD_STACK_NUM | ||
|
||
check_error 'f vfs_read ^$arg10000' # BAD_ARG_NUM | ||
|
||
check_error 'f vfs_read ^$none_var' # BAD_VAR | ||
check_error 'f vfs_read ^'$REG # BAD_VAR | ||
|
||
check_error 'f vfs_read ^@12345678abcde' # BAD_MEM_ADDR | ||
check_error 'f vfs_read ^@+10' # FILE_ON_KPROBE | ||
|
||
grep -q "imm-value" README && \ | ||
check_error 'f vfs_read arg1=\^x' # BAD_IMM | ||
grep -q "imm-string" README && \ | ||
check_error 'f vfs_read arg1=\"abcd^' # IMMSTR_NO_CLOSE | ||
|
||
check_error 'f vfs_read ^+0@0)' # DEREF_NEED_BRACE | ||
check_error 'f vfs_read ^+0ab1(@0)' # BAD_DEREF_OFFS | ||
check_error 'f vfs_read +0(+0(@0^)' # DEREF_OPEN_BRACE | ||
|
||
if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then | ||
check_error 'f vfs_read +0(^$comm)' # COMM_CANT_DEREF | ||
fi | ||
|
||
check_error 'f vfs_read ^&1' # BAD_FETCH_ARG | ||
|
||
|
||
# We've introduced this limitation with array support | ||
if grep -q ' <type>\\\[<array-size>\\\]' README; then | ||
check_error 'f vfs_read +0(^+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(+0(@0))))))))))))))' # TOO_MANY_OPS? | ||
check_error 'f vfs_read +0(@11):u8[10^' # ARRAY_NO_CLOSE | ||
check_error 'f vfs_read +0(@11):u8[10]^a' # BAD_ARRAY_SUFFIX | ||
check_error 'f vfs_read +0(@11):u8[^10a]' # BAD_ARRAY_NUM | ||
check_error 'f vfs_read +0(@11):u8[^256]' # ARRAY_TOO_BIG | ||
fi | ||
|
||
check_error 'f vfs_read @11:^unknown_type' # BAD_TYPE | ||
check_error 'f vfs_read $stack0:^string' # BAD_STRING | ||
check_error 'f vfs_read @11:^b10@a/16' # BAD_BITFIELD | ||
|
||
check_error 'f vfs_read ^arg123456789012345678901234567890=@11' # ARG_NAME_TOO_LOG | ||
check_error 'f vfs_read ^=@11' # NO_ARG_NAME | ||
check_error 'f vfs_read ^var.1=@11' # BAD_ARG_NAME | ||
check_error 'f vfs_read var1=@11 ^var1=@12' # USED_ARG_NAME | ||
check_error 'f vfs_read ^+1234567(+1234567(+1234567(+1234567(+1234567(+1234567(@1234))))))' # ARG_TOO_LONG | ||
check_error 'f vfs_read arg1=^' # NO_ARG_BODY | ||
|
||
|
||
# multiprobe errors | ||
if grep -q "Create/append/" README && grep -q "imm-value" README; then | ||
echo "f:fprobes/testevent $FUNCTION_FORK" > dynamic_events | ||
check_error '^f:fprobes/testevent do_exit%return' # DIFF_PROBE_TYPE | ||
|
||
# Explicitly use printf "%s" to not interpret \1 | ||
printf "%s" "f:fprobes/testevent $FUNCTION_FORK abcd=\\1" > dynamic_events | ||
check_error "f:fprobes/testevent $FUNCTION_FORK ^bcd=\\1" # DIFF_ARG_TYPE | ||
check_error "f:fprobes/testevent $FUNCTION_FORK ^abcd=\\1:u8" # DIFF_ARG_TYPE | ||
check_error "f:fprobes/testevent $FUNCTION_FORK ^abcd=\\\"foo\"" # DIFF_ARG_TYPE | ||
check_error "^f:fprobes/testevent $FUNCTION_FORK abcd=\\1" # SAME_PROBE | ||
fi | ||
|
||
# %return suffix errors | ||
check_error 'f vfs_read^%hoge' # BAD_ADDR_SUFFIX | ||
|
||
exit 0 |