Merge tag 'trace-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing updates from Steven Rostedt: - Addition of multiprobes to kprobe and uprobe events (allows for more than one probe attached to the same location) - Addition of adding immediates to probe parameters - Clean up of the recordmcount.c code. This brings us closer to merging recordmcount into objtool, and reuse code. - Other small clean ups * tag 'trace-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (33 commits) selftests/ftrace: Update kprobe event error testcase tracing/probe: Reject exactly same probe event tracing/probe: Fix to allow user to enable events on unloaded modules selftests/ftrace: Select an existing function in kprobe_eventname test tracing/kprobe: Fix NULL pointer access in trace_porbe_unlink() tracing: Make sure variable reference alias has correct var_ref_idx tracing: Be more clever when dumping hex in __print_hex() ftrace: Simplify ftrace hash lookup code in clear_func_from_hash() tracing: Add "gfp_t" support in synthetic_events tracing: Rename tracing_reset() to tracing_reset_cpu() tracing: Document the stack trace algorithm in the comments tracing/arm64: Have max stack tracer handle the case of return address after data recordmcount: Clarify what cleanup() does recordmcount: Remove redundant cleanup() calls recordmcount: Kernel style formatting recordmcount: Kernel style function signature formatting recordmcount: Rewrite error/success handling selftests/ftrace: Add syntax error test for multiprobe selftests/ftrace: Add syntax error test for immediates selftests/ftrace: Add a testcase for kprobe multiprobe event ...
This commit is contained in:
@@ -115,7 +115,7 @@ ftrace_errlog_check() { # err-prefix command-with-error-pos-by-^ command-file
|
||||
command=$(echo "$2" | tr -d ^)
|
||||
echo "Test command: $command"
|
||||
echo > error_log
|
||||
(! echo "$command" > "$3" ) 2> /dev/null
|
||||
(! echo "$command" >> "$3" ) 2> /dev/null
|
||||
grep "$1: error:" -A 3 error_log
|
||||
N=$(tail -n 1 error_log | wc -c)
|
||||
# " Command: " and "^\n" => 13
|
||||
|
@@ -24,7 +24,21 @@ test -d events/kprobes2/event2 || exit_failure
|
||||
|
||||
:;: "Add an event on dot function without name" ;:
|
||||
|
||||
FUNC=`grep -m 10 " [tT] .*\.isra\..*$" /proc/kallsyms | tail -n 1 | cut -f 3 -d " "`
|
||||
find_dot_func() {
|
||||
if [ ! -f available_filter_functions ]; then
|
||||
grep -m 10 " [tT] .*\.isra\..*$" /proc/kallsyms | tail -n 1 | cut -f 3 -d " "
|
||||
return;
|
||||
fi
|
||||
|
||||
grep " [tT] .*\.isra\..*" /proc/kallsyms | cut -f 3 -d " " | while read f; do
|
||||
if grep -s $f available_filter_functions; then
|
||||
echo $f
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
FUNC=`find_dot_func | tail -n 1`
|
||||
[ "x" != "x$FUNC" ] || exit_unresolved
|
||||
echo "p $FUNC" > kprobe_events
|
||||
EVENT=`grep $FUNC kprobe_events | cut -f 1 -d " " | cut -f 2 -d:`
|
||||
|
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: Create/delete multiprobe on kprobe event
|
||||
|
||||
[ -f kprobe_events ] || exit_unsupported
|
||||
|
||||
grep -q "Create/append/" README || exit_unsupported
|
||||
|
||||
# Choose 2 symbols for target
|
||||
SYM1=_do_fork
|
||||
SYM2=do_exit
|
||||
EVENT_NAME=kprobes/testevent
|
||||
|
||||
DEF1="p:$EVENT_NAME $SYM1"
|
||||
DEF2="p:$EVENT_NAME $SYM2"
|
||||
|
||||
:;: "Define an event which has 2 probes" ;:
|
||||
echo $DEF1 >> kprobe_events
|
||||
echo $DEF2 >> kprobe_events
|
||||
cat kprobe_events | grep "$DEF1"
|
||||
cat kprobe_events | grep "$DEF2"
|
||||
|
||||
:;: "Remove the event by name (should remove both)" ;:
|
||||
echo "-:$EVENT_NAME" >> kprobe_events
|
||||
test `cat kprobe_events | wc -l` -eq 0
|
||||
|
||||
:;: "Remove just 1 event" ;:
|
||||
echo $DEF1 >> kprobe_events
|
||||
echo $DEF2 >> kprobe_events
|
||||
echo "-:$EVENT_NAME $SYM1" >> kprobe_events
|
||||
! cat kprobe_events | grep "$DEF1"
|
||||
cat kprobe_events | grep "$DEF2"
|
||||
|
||||
:;: "Appending different type must fail" ;:
|
||||
! echo "$DEF1 \$stack" >> kprobe_events
|
@@ -41,6 +41,11 @@ check_error 'p vfs_read ^%none_reg' # BAD_REG_NAME
|
||||
check_error 'p vfs_read ^@12345678abcde' # BAD_MEM_ADDR
|
||||
check_error 'p vfs_read ^@+10' # FILE_ON_KPROBE
|
||||
|
||||
grep -q "imm-value" README && \
|
||||
check_error 'p vfs_read arg1=\^x' # BAD_IMM
|
||||
grep -q "imm-string" README && \
|
||||
check_error 'p vfs_read arg1=\"abcd^' # IMMSTR_NO_CLOSE
|
||||
|
||||
check_error 'p vfs_read ^+0@0)' # DEREF_NEED_BRACE
|
||||
check_error 'p vfs_read ^+0ab1(@0)' # BAD_DEREF_OFFS
|
||||
check_error 'p vfs_read +0(+0(@0^)' # DEREF_OPEN_BRACE
|
||||
@@ -82,4 +87,15 @@ case $(uname -m) in
|
||||
;;
|
||||
esac
|
||||
|
||||
# multiprobe errors
|
||||
if grep -q "Create/append/" README && grep -q "imm-value" README; then
|
||||
echo 'p:kprobes/testevent _do_fork' > kprobe_events
|
||||
check_error '^r:kprobes/testevent do_exit' # DIFF_PROBE_TYPE
|
||||
echo 'p:kprobes/testevent _do_fork abcd=\1' > kprobe_events
|
||||
check_error 'p:kprobes/testevent _do_fork ^bcd=\1' # DIFF_ARG_TYPE
|
||||
check_error 'p:kprobes/testevent _do_fork ^abcd=\1:u8' # DIFF_ARG_TYPE
|
||||
check_error 'p:kprobes/testevent _do_fork ^abcd=\"foo"' # DIFF_ARG_TYPE
|
||||
check_error '^p:kprobes/testevent _do_fork' # SAME_PROBE
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
Reference in New Issue
Block a user