[PATCH] tools/perf: Disable perf probe when libtraceevent is missing
Athira Rajeev
atrajeev at linux.vnet.ibm.com
Thu Jan 26 01:46:36 AEDT 2023
> On 20-Jan-2023, at 7:58 PM, Arnaldo Carvalho de Melo <acme at kernel.org> wrote:
>
> Em Fri, Jan 20, 2023 at 05:32:56PM +0530, Athira Rajeev escreveu:
>> While parsing the tracepoint events in parse_events_add_tracepoint()
>> function, code checks for HAVE_LIBTRACEEVENT support. This is needed
>> since libtraceevent is necessary for tracepoint. But while adding
>> probe points, check for LIBTRACEEVENT is not done in case of perf probe.
>> Hence, in environment with missing libtraceevent-devel, it is
>> observed that adding a probe point works even though its not
>> supported.
>
>> Example:
>> Adding probe point:
>> ./perf probe 'vfs_getname=getname_flags:72 pathname=result->name:string'
>> Added new event:
>> probe:vfs_getname (on getname_flags:72 with pathname=result->name:string)
>
>> You can now use it in all perf tools, such as:
>
>> perf record -e probe:vfs_getname -aR sleep 1
>
>> But trying perf record:
>> ./perf record -e probe:vfs_getname -aR sleep 1
>> event syntax error: 'probe:vfs_getname'
>> \___ unsupported tracepoint
>> libtraceevent is necessary for tracepoint support
>> Run 'perf list' for a list of valid events
>>
>> Fix this by wrapping "builtin-probe" compilation and
>> "perf probe" usage under "CONFIG_LIBTRACEEVENT" check.
>
> Humm, but 'perf probe' continues to work, as uou demoed above, the
> problem is with the suggestion to use other perf tools that need to
> parse tracefs and without libtraceevent, currently can't do it:
>
> [root at quaco ~]# perf probe 'vfs_getname=getname_flags:72 pathname=result->name:string'
> Added new event:
> probe:vfs_getname (on getname_flags:72 with pathname=result->name:string)
>
> You can now use it in all perf tools, such as:
>
> perf record -e probe:vfs_getname -aR sleep 1
>
> [root at quaco ~]# perf probe -l
> probe:vfs_getname (on getname_flags:72 at fs/namei.c with pathname)
> [root at quaco ~]# perf trace -e probe:vfs_getname
> perf: 'trace' is not a perf-command. See 'perf --help'.
> [root at quaco ~]# cd /sys/kernel/tracing/events/probe/vfs_getname/
> [root at quaco vfs_getname]# ls
> enable filter format hist id trigger
> [root at quaco vfs_getname]# ls -la
> total 0
> drwxr-x---. 2 root root 0 Jan 20 11:18 .
> drwxr-x---. 3 root root 0 Jan 20 11:18 ..
> -rw-r-----. 1 root root 0 Jan 20 11:18 enable
> -rw-r-----. 1 root root 0 Jan 20 11:18 filter
> -r--r-----. 1 root root 0 Jan 20 11:18 format
> -r--r-----. 1 root root 0 Jan 20 11:18 hist
> -r--r-----. 1 root root 0 Jan 20 11:18 id
> -rw-r-----. 1 root root 0 Jan 20 11:18 trigger
> [root at quaco vfs_getname]#
>
> But we can go on from there:
>
> [root at quaco tracing]# pwd
> /sys/kernel/tracing
> [root at quaco tracing]# echo 1 > /sys/kernel/tracing/events/probe/vfs_getname/enable
> [root at quaco tracing]# echo 1 > tracing_on
> [root at quaco tracing]# head trace_pipe
> systemd-oomd-979 [003] ..... 96369.978971: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service"
> systemd-oomd-979 [003] ..... 96369.979022: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service/memory.current"
> systemd-oomd-979 [003] ..... 96369.979084: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname=""
> systemd-oomd-979 [003] ..... 96369.979162: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service/memory.min"
> systemd-oomd-979 [003] ..... 96369.979197: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname=""
> systemd-oomd-979 [003] ..... 96369.979267: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service/memory.low"
> systemd-oomd-979 [003] ..... 96369.979303: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname=""
> systemd-oomd-979 [003] ..... 96369.979372: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service/memory.swap.current"
> systemd-oomd-979 [003] ..... 96369.979406: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname=""
> systemd-oomd-979 [003] ..... 96369.979475: vfs_getname: (getname_flags.part.0+0x6b/0x1c0) pathname="/sys/fs/cgroup/user.slice/user-1000.slice/user at 1000.service/memory.stat"
> [root at quaco tracing]#
>
> So you could instead replace the suggestion from:
>
> "
> You can now use it in all perf tools, such as:
>
> perf record -e probe:vfs_getname -aR sleep 1
> "
>
> To:
>
> "
> perf is not linked with libtraceevent, to use the new probe you
> can use tracefs:
>
> cd /sys/kernel/tracing/
> echo 1 > events/probe/vfs_getname/enable
> echo 1 > tracing_on
> cat trace_pipe
> "
>
> wdyt?
Hi Arnaldo,
Thanks for the suggestion. The idea to change usage message based on presence of libtraceevent is good.
I could try change with HAVE_LIBTRACEEVENT condition. Sample snippet below:
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index ed73d0b89ca2..f010d0e43577 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -383,9 +383,17 @@ static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs)
/* Note that it is possible to skip all events because of blacklist */
if (event) {
+#ifndef HAVE_LIBTRACEEVENT
+ pr_info("\nperf is not linked with libtraceevent, to use the new probe you can use tracefs:\n\n");
+ pr_info("\tcd /sys/kernel/tracing/\n");
+ pr_info("\techo 1 > events/%s/%s/enable\n", group, event);
+ pr_info("\techo 1 > tracing_on\n");
+ pr_info("\tcat trace_pipe\n");
+#else
/* Show how to use the event. */
pr_info("\nYou can now use it in all perf tools, such as:\n\n");
pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
+#endif
}
out_cleanup:
I will re-work on patch changes and also test for other options ( perf probe with different group “GROUP" values etc) to make sure this works via tracefs.
Arnaldo, the above approach looks fine to proceed with ?
Thanks
Athira
>
> - Arnaldo
>
>> Signed-off-by: Athira Rajeev <atrajeev at linux.vnet.ibm.com>
>> ---
>> tools/perf/Build | 4 +++-
>> tools/perf/perf.c | 2 ++
>> 2 files changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/tools/perf/Build b/tools/perf/Build
>> index 6dd67e502295..a138a2304929 100644
>> --- a/tools/perf/Build
>> +++ b/tools/perf/Build
>> @@ -33,7 +33,9 @@ ifeq ($(CONFIG_LIBTRACEEVENT),y)
>> perf-$(CONFIG_TRACE) += trace/beauty/
>> endif
>>
>> -perf-$(CONFIG_LIBELF) += builtin-probe.o
>> +ifeq ($(CONFIG_LIBTRACEEVENT),y)
>> + perf-$(CONFIG_LIBELF) += builtin-probe.o
>> +endif
>>
>> perf-y += bench/
>> perf-y += tests/
>> diff --git a/tools/perf/perf.c b/tools/perf/perf.c
>> index 82bbe0ca858b..7b0d79284d5a 100644
>> --- a/tools/perf/perf.c
>> +++ b/tools/perf/perf.c
>> @@ -80,9 +80,11 @@ static struct cmd_struct commands[] = {
>> #ifdef HAVE_LIBTRACEEVENT
>> { "sched", cmd_sched, 0 },
>> #endif
>> +#ifdef HAVE_LIBTRACEEVENT
>> #ifdef HAVE_LIBELF_SUPPORT
>> { "probe", cmd_probe, 0 },
>> #endif
>> +#endif
>> #ifdef HAVE_LIBTRACEEVENT
>> { "kmem", cmd_kmem, 0 },
>> { "lock", cmd_lock, 0 },
>> --
>> 2.39.0
>
> --
>
> - Arnaldo
More information about the Linuxppc-dev
mailing list