perf trace: Support multiple "vfs_getname" probes

With a suitably defined "probe:vfs_getname" probe, 'perf trace' can
"beautify" its output, so syscalls like open() or openat() can print the
"filename" argument instead of just its hex address, like:

$ perf trace -e open -- touch /dev/null
[...]
0.590 ( 0.014 ms): touch/18063 open(filename: /dev/null, flags: CREAT|NOCTTY|NONBLOCK|WRONLY, mode: IRUGO|IWUGO) = 3
[...]

The output without such beautifier looks like:

0.529 ( 0.011 ms): touch/18075 open(filename: 0xc78cf288, flags: CREAT|NOCTTY|NONBLOCK|WRONLY, mode: IRUGO|IWUGO) = 3

However, when the vfs_getname probe expands to multiple probes and it is
not the first one that is hit, the beautifier fails, as following:

0.326 ( 0.010 ms): touch/18072 open(filename: , flags: CREAT|NOCTTY|NONBLOCK|WRONLY, mode: IRUGO|IWUGO) = 3

Fix it by hooking into all the expanded probes (inlines), now, for instance:

[root@quaco ~]# perf probe -l
probe:vfs_getname (on getname_flags:73@fs/namei.c with pathname)
probe:vfs_getname_1 (on getname_flags:73@fs/namei.c with pathname)
[root@quaco ~]# perf trace -e open* sleep 1
0.010 ( 0.005 ms): sleep/5588 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: RDONLY|CLOEXEC) = 3
0.029 ( 0.006 ms): sleep/5588 openat(dfd: CWD, filename: /lib64/libc.so.6, flags: RDONLY|CLOEXEC) = 3
0.194 ( 0.008 ms): sleep/5588 openat(dfd: CWD, filename: /usr/lib/locale/locale-archive, flags: RDONLY|CLOEXEC) = 3
[root@quaco ~]#

Works, further verified with:

[root@quaco ~]# perf test vfs
65: Use vfs_getname probe to get syscall args filenames : Ok
66: Add vfs_getname probe to get syscall args filenames : Ok
67: Check open filename arg using perf trace + vfs_getname: Ok
[root@quaco ~]#

Reported-by: Michael Petlan <mpetlan@redhat.com>
Tested-by: Michael Petlan <mpetlan@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-mv8kolk17xla1smvmp3qabv1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

Changed files
+18 -7
tools
+18 -7
tools/perf/builtin-trace.c
··· 2514 2514 2515 2515 static bool perf_evlist__add_vfs_getname(struct perf_evlist *evlist) 2516 2516 { 2517 - struct perf_evsel *evsel = perf_evsel__newtp("probe", "vfs_getname"); 2517 + bool found = false; 2518 + struct perf_evsel *evsel, *tmp; 2519 + struct parse_events_error err = { .idx = 0, }; 2520 + int ret = parse_events(evlist, "probe:vfs_getname*", &err); 2518 2521 2519 - if (IS_ERR(evsel)) 2522 + if (ret) 2520 2523 return false; 2521 2524 2522 - if (perf_evsel__field(evsel, "pathname") == NULL) { 2525 + evlist__for_each_entry_safe(evlist, evsel, tmp) { 2526 + if (!strstarts(perf_evsel__name(evsel), "probe:vfs_getname")) 2527 + continue; 2528 + 2529 + if (perf_evsel__field(evsel, "pathname")) { 2530 + evsel->handler = trace__vfs_getname; 2531 + found = true; 2532 + continue; 2533 + } 2534 + 2535 + list_del_init(&evsel->node); 2536 + evsel->evlist = NULL; 2523 2537 perf_evsel__delete(evsel); 2524 - return false; 2525 2538 } 2526 2539 2527 - evsel->handler = trace__vfs_getname; 2528 - perf_evlist__add(evlist, evsel); 2529 - return true; 2540 + return found; 2530 2541 } 2531 2542 2532 2543 static struct perf_evsel *perf_evsel__new_pgfault(u64 config)