perf probe: List probes in stdout
PATCH 1/1 perf probe: List probes in stdout
Since commit 5e17b28f1e have replaced printf with pr_info, perf probe -l outputs its result in stderr. However, that is not what the commit expected.
e.g.
-----
# perf probe -l > /dev/null
probe:vfs_read (on vfs_read@ksrc/linux-3/fs/read_write.c)
-----
With this fix,
-----
# perf probe -l > list
# cat list
probe:vfs_read (on vfs_read@ksrc/linux-3/fs/read_write.c)
-----
Of course, --quiet(-q) still works on --add/--del.
-----
# perf probe -q vfs_write
# perf probe -l
probe:vfs_read (on vfs_read@ksrc/linux-3/fs/read_write.c)
probe:vfs_write (on vfs_write@ksrc/linux-3/fs/read_write.c)
-----Signed-off-by Masami Hiramatsu <[email protected]>
Reported-by Naohiro Aota <[email protected]>
--- tools/perf/util/probe-event.c | 50 ++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 14 deletions(-)
tools/perf/util/probe-event.c +36 -14
@@ -2126,9 +2126,9 @@ kprobe_blacklist__find_by_address(struct list_head *blacklist,return NULL ; } -/* Show an event */ -static int show_perf_probe_event (struct perf_probe_event *pev, -const char *module) +static int perf_probe_event__sprintf (struct perf_probe_event *pev, +const char *module, +struct strbuf *result) {int i, ret;char buf[128 ];
@@ -2141,25 +2141,46 @@ static int show_perf_probe_event(struct perf_probe_event *pev, ret =e_snprintf (buf,128 ,"%s:%s" , pev->group, pev->event);if (ret <0 ) -return ret; + goto out; -pr_info (" %-20s (on %s" , buf, place); +strbuf_addf (result," %-20s (on %s" , buf, place);if (module) -pr_info (" in %s" , module); +strbuf_addf (result," in %s" , module);if (pev->nargs >0 ) { -pr_info (" with" ); +strbuf_addstr (result," with" );for (i =0 ; i < pev->nargs; i++) { ret =synthesize_perf_probe_arg (&pev->args[i], buf,128 );if (ret <0 ) -break ; -pr_info (" %s" , buf); + goto out; +strbuf_addf (result," %s" , buf); } } -pr_info (")\n" ); +strbuf_addch (result,')' ); +out:free (place);return ret; + +} + +/* Show an event */ +static int show_perf_probe_event (struct perf_probe_event *pev, +const char *module,bool use_pr) +{ +struct strbuf buf =STRBUF_INIT ; +int ret; + + ret =perf_probe_event__sprintf (pev, module, &buf); +if (ret >=0 ) { +if (use_pr) +pr_info ("%s\n" , buf.buf); +else +printf ("%s\n" , buf.buf); + } +strbuf_release (&buf); + +return ret; } static bool filter_probe_trace_event(struct probe_trace_event *tev,
@@ -2200,9 +2221,10 @@ static int __show_perf_probe_events(int fd, bool is_kprobe, goto next; ret =convert_to_perf_probe_event (&tev, &pev, is_kprobe); -if (ret >=0 ) - ret =show_perf_probe_event (&pev, - tev.point.module); +if (ret <0 ) + goto next; + ret =show_perf_probe_event (&pev, tev.point.module, + false); } next:clear_perf_probe_event (&pev);
@@ -2463,7 +2485,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, group = pev->group; pev->event = tev->event; pev->group = tev->group; -show_perf_probe_event (pev, tev->point.module); +show_perf_probe_event (pev, tev->point.module, true);/* Trick here - restore current event/group */ pev->event = (char *)event; pev->group = (char *)group;