perf probe: Add ustring support for perf probe command
PATCH 1/1 perf probe: Add ustring support for perf probe command
Kernel commit 88903c464321 ("tracing/probe: Add ustring type for user-space string") adds support for user-space strings when type ustring is specified.
Here is an example using command line setup of the kprobe.
Function to probe:
struct filename *
getname_flags(const char __user *filename, int flags, int *empty)
Setup:
# cd /sys/kernel/debug/tracing/ # echo 'p:tmr1 getname_flags +0(%r2):ustring' > kprobe_events # cat events/kprobes/tmr1/format | fgrep print print fmt: "(%lx) arg1=\"%s\"", REC->__probe_ip, REC->arg1 # echo 1 > events/kprobes/tmr1/enable # touch /tmp/111 # echo 0 > events/kprobes/tmr1/enable # cat trace|fgrep /tmp/111 touch-5846 [005] d..2 255520.717960: tmr1:\ (getname_flags+0x0/0x400) arg1="/tmp/111"
Doing the same with the perf tool fails. First using string succeeds:
# perf probe "vfs_getname=getname_flags:72 pathname=filename:string" Added new event: probe:vfs_getname (on getname_flags:72 with pathname=filename:string) .... # perf probe -d probe:vfs_getname Removed event: probe:vfs_getname
Using ustring fails (output before):
# perf probe "vfs_getname=getname_flags:72 pathname=filename:ustring" Failed to write event: Invalid argument Error: Failed to add events. #
Fix this by added type 'ustring' in function convert_variable_type().
Using ustring succeeds (output after):
# ./perf probe "vfs_getname=getname_flags:72 pathname=filename:ustring" Added new event: probe:vfs_getname (on getname_flags:72 with pathname=filename:ustring)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
Note: This issue also exists on x86, it is not s390 specific.
--- tools/perf/util/probe-finder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/probe-finder.c +2 -1
@@ -303,7 +303,8 @@ static int convert_variable_type(Dwarf_Die *vr_die,char prefix;/* TODO: check all types */ -if (cast &&strcmp (cast,"string" ) !=0 &&strcmp (cast,"x" ) !=0 && +if (cast &&strcmp (cast,"string" ) !=0 &&strcmp (cast,"ustring" ) && +strcmp (cast,"x" ) !=0 &&strcmp (cast,"s" ) !=0 &&strcmp (cast,"u" ) !=0 ) {/* Non string type is OK */ /* and respect signedness/hexadecimal cast */
Signature · 1 line
2.21.0
PATCH 1/1 perf test: Fix test trace+probe_vfs_getname.sh
This test places a kprobe to function getname_flags() in the kernel which has the following prototype:
struct filename *
getname_flags(const char __user *filename, int flags, int *empty)
Variable filename points to a filename located in user space memory. Looking at
commit 88903c464321c ("tracing/probe: Add ustring type for user-space string") the kprobe should indicate that user space memory is accessed.
So I suggest the following patch to specify user space memory access where 'string' is replaced by 'ustring'.
--- tools/perf/tests/shell/lib/probe_vfs_getname.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/tests/shell/lib/probe_vfs_getname.sh +2 -2
@@ -13,8 +13,8 @@ add_probe_vfs_getname() { local verbose=$1 if [ $had_vfs_getname -eq 1 ] ; then line=$(perf probe -L getname_flags 2>&1 | egrep 'result.*=.*filename;' | sed -r 's/[[:space:]]+([[:digit:]]+)[[:space:]]+result->uptr.*/\1/') - perf probe -q "vfs_getname=getname_flags:${line} pathname=result->name:string" || \ - perf probe $verbose "vfs_getname=getname_flags:${line} pathname=filename:string" + perf probe -q "vfs_getname=getname_flags:${line} pathname=result->uptr:ustring" || \ + perf probe $verbose "vfs_getname=getname_flags:${line} pathname=filename:ustring" fi }
Signature · 1 line
2.21.0