Message ID | 1440822125-52691-15-git-send-email-wangnan0@huawei.com |
---|---|
State | New |
Headers | show |
On Sat, Aug 29, 2015 at 04:21:48AM +0000, Wang Nan wrote: > This patch suppresses message output by add_perf_probe_events() and > del_perf_probe_events() if they are triggered by BPF loading. Before > this patch, when using 'perf record' with BPF object/source as event > selector, following message will be output: > > Added new event: > perf_bpf_probe:lock_page_ret (on __lock_page%return) > You can now use it in all perf tools, such as: > perf record -e perf_bpf_probe:lock_page_ret -aR sleep 1 > ... > Removed event: perf_bpf_probe:lock_page_ret > > Which is misleading, especially 'use it in all perf tools' because they > will be removed after 'pref record' exit. > > In this patch, a 'silent' field is appended into probe_conf to control > output. bpf__{,un}probe() set it to true when calling > {add,del}_perf_probe_events(). I think that printing those messages should be done in cmd_probe() rather than add/del_perf_probe_events().. Thanks, Namhyung > > Signed-off-by: Wang Nan <wangnan0@huawei.com> > Cc: Arnaldo Carvalho de Melo <acme@redhat.com> > Cc: Alexei Starovoitov <ast@plumgrid.com> > Cc: Brendan Gregg <brendan.d.gregg@gmail.com> > Cc: Daniel Borkmann <daniel@iogearbox.net> > Cc: David Ahern <dsahern@gmail.com> > Cc: He Kuang <hekuang@huawei.com> > Cc: Jiri Olsa <jolsa@kernel.org> > Cc: Kaixu Xia <xiakaixu@huawei.com> > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > Cc: Namhyung Kim <namhyung@kernel.org> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> > Cc: Zefan Li <lizefan@huawei.com> > Cc: pi3orama@163.com > Link: http://lkml.kernel.org/n/1440151770-129878-12-git-send-email-wangnan0@huawei.com > --- > tools/perf/util/bpf-loader.c | 6 ++++++ > tools/perf/util/probe-event.c | 17 ++++++++++++----- > tools/perf/util/probe-event.h | 1 + > tools/perf/util/probe-file.c | 5 ++++- > 4 files changed, 23 insertions(+), 6 deletions(-) > > diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c > index c3bc0a8..77eeb99 100644 > --- a/tools/perf/util/bpf-loader.c > +++ b/tools/perf/util/bpf-loader.c > @@ -188,6 +188,7 @@ static bool is_probed; > int bpf__unprobe(void) > { > struct strfilter *delfilter; > + bool old_silent = probe_conf.silent; > int ret; > > if (!is_probed) > @@ -199,7 +200,9 @@ int bpf__unprobe(void) > return -ENOMEM; > } > > + probe_conf.silent = true; > ret = del_perf_probe_events(delfilter); > + probe_conf.silent = old_silent; > strfilter__delete(delfilter); > if (ret < 0 && is_probed) > pr_debug("Error: failed to delete events: %s\n", > @@ -215,6 +218,7 @@ int bpf__probe(void) > struct bpf_object *obj, *tmp; > struct bpf_program *prog; > struct perf_probe_event *pevs; > + bool old_silent = probe_conf.silent; > > pevs = calloc(MAX_PROBES, sizeof(pevs[0])); > if (!pevs) > @@ -235,9 +239,11 @@ int bpf__probe(void) > } > } > > + probe_conf.silent = true; > probe_conf.max_probes = MAX_PROBES; > /* Let add_perf_probe_events generates probe_trace_event (tevs) */ > err = add_perf_probe_events(pevs, nr_events, false); > + probe_conf.silent = old_silent; > > /* add_perf_probe_events return negative when fail */ > if (err < 0) { > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index 57a7bae..e720913 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -52,7 +52,9 @@ > #define PERFPROBE_GROUP "probe" > > bool probe_event_dry_run; /* Dry run flag */ > -struct probe_conf probe_conf; > +struct probe_conf probe_conf = { > + .silent = false, > +}; > > #define semantic_error(msg ...) pr_err("Semantic error :" msg) > > @@ -2192,10 +2194,12 @@ static int show_perf_probe_event(const char *group, const char *event, > > ret = perf_probe_event__sprintf(group, event, pev, module, &buf); > if (ret >= 0) { > - if (use_stdout) > + if (use_stdout && !probe_conf.silent) > printf("%s\n", buf.buf); > - else > + else if (!probe_conf.silent) > pr_info("%s\n", buf.buf); > + else > + pr_debug("%s\n", buf.buf); > } > strbuf_release(&buf); > > @@ -2418,7 +2422,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > } > > ret = 0; > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > + if (!probe_conf.silent) > + pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > + else > + pr_debug("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > for (i = 0; i < ntevs; i++) { > tev = &tevs[i]; > /* Skip if the symbol is out of .text or blacklisted */ > @@ -2454,7 +2461,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > warn_uprobe_event_compat(tev); > > /* Note that it is possible to skip all events because of blacklist */ > - if (ret >= 0 && event) { > + if (ret >= 0 && event && !probe_conf.silent) { > /* 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); > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h > index 915f0d8..3ab9c3e 100644 > --- a/tools/perf/util/probe-event.h > +++ b/tools/perf/util/probe-event.h > @@ -13,6 +13,7 @@ struct probe_conf { > bool force_add; > bool no_inlines; > int max_probes; > + bool silent; > }; > extern struct probe_conf probe_conf; > extern bool probe_event_dry_run; > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c > index bbb2437..db7bd4c 100644 > --- a/tools/perf/util/probe-file.c > +++ b/tools/perf/util/probe-file.c > @@ -267,7 +267,10 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) > goto error; > } > > - pr_info("Removed event: %s\n", ent->s); > + if (!probe_conf.silent) > + pr_info("Removed event: %s\n", ent->s); > + else > + pr_debug("Removed event: %s\n", ent->s); > return 0; > error: > pr_warning("Failed to delete event: %s\n", > -- > 2.1.0 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
> From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim > > On Sat, Aug 29, 2015 at 04:21:48AM +0000, Wang Nan wrote: > > This patch suppresses message output by add_perf_probe_events() and > > del_perf_probe_events() if they are triggered by BPF loading. Before > > this patch, when using 'perf record' with BPF object/source as event > > selector, following message will be output: > > > > Added new event: > > perf_bpf_probe:lock_page_ret (on __lock_page%return) > > You can now use it in all perf tools, such as: > > perf record -e perf_bpf_probe:lock_page_ret -aR sleep 1 > > ... > > Removed event: perf_bpf_probe:lock_page_ret > > > > Which is misleading, especially 'use it in all perf tools' because they > > will be removed after 'pref record' exit. > > > > In this patch, a 'silent' field is appended into probe_conf to control > > output. bpf__{,un}probe() set it to true when calling > > {add,del}_perf_probe_events(). > > I think that printing those messages should be done in cmd_probe() > rather than add/del_perf_probe_events().. Well... try to cleanup the messages. Thanks! >
Hi Namhyung, So, I hope this would be what you've suggested. Thank you, -- Masami HIRAMATSU Linux Technology Research Center, System Productivity Research Dept. Center for Technology Innovation - Systems Engineering Hitachi, Ltd., Research & Development Group E-mail: masami.hiramatsu.pt@hitachi.com > -----Original Message----- > From: Masami Hiramatsu [mailto:masami.hiramatsu.pt@hitachi.com] > Sent: Thursday, September 03, 2015 9:11 PM > To: Namhyung Kim; Arnaldo Carvalho de Melo > Cc: Wang Nan; Kaixu Xia; Peter Zijlstra; Daniel Borkmann; linux-kernel@vger.kernel.org; He Kuang; lizefan@huawei.com; > Jiri Olsa; David Ahern; Brendan Gregg; mingo@kernel.org; ast@plumgrid.com > Subject: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe > > Output the normal result of adding/deleting probe in buildin-probe > instead of showing it by add/del_perf_probe_events. > All the result string is stored into "result" strbuf parameter. > If you want to ignore the result string, pass a NULL to the "result". > Note that all warning/debug strings are still in the > add/del_perf_probe_events. > > Suggested-by: Namhyung Kim <namhyung@gmail.com> > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > --- > tools/perf/builtin-probe.c | 9 +++++++-- > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++------------- > tools/perf/util/probe-event.h | 6 ++++-- > tools/perf/util/probe-file.c | 5 +++-- > tools/perf/util/probe-file.h | 4 +++- > 5 files changed, 37 insertions(+), 20 deletions(-) > > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c > index b81cec3..d11ad21 100644 > --- a/tools/perf/builtin-probe.c > +++ b/tools/perf/builtin-probe.c > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > "Enable kernel symbol demangling"), > OPT_END() > }; > + struct strbuf buf = STRBUF_INIT; > int ret; > > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); > @@ -483,7 +484,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > return ret; > #endif > case 'd': > - ret = del_perf_probe_events(params.filter); > + ret = del_perf_probe_events(params.filter, &buf); > + /* Even if failed, we should show the result first */ > + pr_info("%s", buf.buf); > if (ret < 0) { > pr_err_with_code(" Error: Failed to delete events.", ret); > return ret; > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > usage_with_options(probe_usage, options); > } > > - ret = add_perf_probe_events(params.events, params.nevents); > + ret = add_perf_probe_events(params.events, params.nevents, &buf); > + /* Even if failed, we should show the result first */ > + pr_info("%s", buf.buf); > if (ret < 0) { > pr_err_with_code(" Error: Failed to add events.", ret); > return ret; > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index eb5f18b..1a3ed7c 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev, > > static int __add_probe_trace_events(struct perf_probe_event *pev, > struct probe_trace_event *tevs, > - int ntevs, bool allow_suffix) > + int ntevs, bool allow_suffix, > + struct strbuf *buf) > { > int i, fd, ret; > struct probe_trace_event *tev = NULL; > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > } > > ret = 0; > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > + if (buf) > + strbuf_addf(buf, "Added new event%s\n", > + (ntevs > 1) ? "s:" : ":"); > for (i = 0; i < ntevs; i++) { > tev = &tevs[i]; > /* Skip if the symbol is out of .text or blacklisted */ > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > if (ret < 0) > break; > > - /* We use tev's name for showing new events */ > - show_perf_probe_event(tev->group, tev->event, pev, > - tev->point.module, false); > + if (buf) { > + /* We use tev's name for showing new events */ > + perf_probe_event__sprintf(tev->group, tev->event, > + pev, tev->point.module, buf); > + strbuf_addch(buf, '\n'); > + } > /* Save the last valid name */ > event = tev->event; > group = tev->group; > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > warn_uprobe_event_compat(tev); > > /* Note that it is possible to skip all events because of blacklist */ > - if (ret >= 0 && event) { > + if (ret >= 0 && event && buf) { > /* 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); > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n"); > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event); > } > > strlist__delete(namelist); > @@ -2765,7 +2771,8 @@ struct __event_package { > int ntevs; > }; > > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > + struct strbuf *result) > { > int i, j, ret; > struct __event_package *pkgs; > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > for (i = 0; i < npevs; i++) { > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, > pkgs[i].ntevs, > - probe_conf.force_add); > + probe_conf.force_add, result); > if (ret < 0) > break; > } > @@ -2819,7 +2826,7 @@ end: > return ret; > } > > -int del_perf_probe_events(struct strfilter *filter) > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result) > { > int ret, ret2, ufd = -1, kfd = -1; > char *str = strfilter__string(filter); > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter) > if (ret < 0) > goto out; > > - ret = probe_file__del_events(kfd, filter); > + ret = probe_file__del_events(kfd, filter, result); > if (ret < 0 && ret != -ENOENT) > goto error; > > - ret2 = probe_file__del_events(ufd, filter); > + ret2 = probe_file__del_events(ufd, filter, result); > if (ret2 < 0 && ret2 != -ENOENT) { > ret = ret2; > goto error; > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h > index 6e7ec68..9855dbf 100644 > --- a/tools/perf/util/probe-event.h > +++ b/tools/perf/util/probe-event.h > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr); > /* Initialize line range */ > extern int line_range__init(struct line_range *lr); > > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs); > -extern int del_perf_probe_events(struct strfilter *filter); > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > + struct strbuf *result); > +extern int del_perf_probe_events(struct strfilter *filter, > + struct strbuf *result); > extern int show_perf_probe_events(struct strfilter *filter); > extern int show_line_range(struct line_range *lr, const char *module, > bool user); > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c > index bbb2437..e22fa12 100644 > --- a/tools/perf/util/probe-file.c > +++ b/tools/perf/util/probe-file.c > @@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) > goto error; > } > > - pr_info("Removed event: %s\n", ent->s); > return 0; > error: > pr_warning("Failed to delete event: %s\n", > @@ -275,7 +274,7 @@ error: > return ret; > } > > -int probe_file__del_events(int fd, struct strfilter *filter) > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf) > { > struct strlist *namelist; > struct str_node *ent; > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter) > ret = __del_trace_probe_event(fd, ent); > if (ret < 0) > break; > + if (buf) > + strbuf_addf(buf, "Removed event: %s\n", ent->s); > } > } > strlist__delete(namelist); > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h > index ada94a2..ee89ef0 100644 > --- a/tools/perf/util/probe-file.h > +++ b/tools/perf/util/probe-file.h > @@ -1,6 +1,7 @@ > #ifndef __PROBE_FILE_H > #define __PROBE_FILE_H > > +#include "strbuf.h" > #include "strlist.h" > #include "strfilter.h" > #include "probe-event.h" > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag); > struct strlist *probe_file__get_namelist(int fd); > struct strlist *probe_file__get_rawlist(int fd); > int probe_file__add_event(int fd, struct probe_trace_event *tev); > -int probe_file__del_events(int fd, struct strfilter *filter); > +int probe_file__del_events(int fd, struct strfilter *filter, > + struct strbuf *buf); > > #endif >
On Thu, Sep 03, 2015 at 12:18:28PM +0000, 平松雅巳 / HIRAMATU,MASAMI wrote: > Hi Namhyung, > > So, I hope this would be what you've suggested. > > Thank you, Hi Masami, I think something different, but this can be ok. Anyway, I'll send my idea soon.. Thanks, Namhyung > > -- > Masami HIRAMATSU > Linux Technology Research Center, System Productivity Research Dept. > Center for Technology Innovation - Systems Engineering > Hitachi, Ltd., Research & Development Group > E-mail: masami.hiramatsu.pt@hitachi.com > > > > -----Original Message----- > > From: Masami Hiramatsu [mailto:masami.hiramatsu.pt@hitachi.com] > > Sent: Thursday, September 03, 2015 9:11 PM > > To: Namhyung Kim; Arnaldo Carvalho de Melo > > Cc: Wang Nan; Kaixu Xia; Peter Zijlstra; Daniel Borkmann; linux-kernel@vger.kernel.org; He Kuang; lizefan@huawei.com; > > Jiri Olsa; David Ahern; Brendan Gregg; mingo@kernel.org; ast@plumgrid.com > > Subject: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe > > > > Output the normal result of adding/deleting probe in buildin-probe > > instead of showing it by add/del_perf_probe_events. > > All the result string is stored into "result" strbuf parameter. > > If you want to ignore the result string, pass a NULL to the "result". > > Note that all warning/debug strings are still in the > > add/del_perf_probe_events. > > > > Suggested-by: Namhyung Kim <namhyung@gmail.com> > > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > > --- > > tools/perf/builtin-probe.c | 9 +++++++-- > > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++------------- > > tools/perf/util/probe-event.h | 6 ++++-- > > tools/perf/util/probe-file.c | 5 +++-- > > tools/perf/util/probe-file.h | 4 +++- > > 5 files changed, 37 insertions(+), 20 deletions(-) > > > > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c > > index b81cec3..d11ad21 100644 > > --- a/tools/perf/builtin-probe.c > > +++ b/tools/perf/builtin-probe.c > > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > "Enable kernel symbol demangling"), > > OPT_END() > > }; > > + struct strbuf buf = STRBUF_INIT; > > int ret; > > > > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); > > @@ -483,7 +484,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > return ret; > > #endif > > case 'd': > > - ret = del_perf_probe_events(params.filter); > > + ret = del_perf_probe_events(params.filter, &buf); > > + /* Even if failed, we should show the result first */ > > + pr_info("%s", buf.buf); > > if (ret < 0) { > > pr_err_with_code(" Error: Failed to delete events.", ret); > > return ret; > > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > usage_with_options(probe_usage, options); > > } > > > > - ret = add_perf_probe_events(params.events, params.nevents); > > + ret = add_perf_probe_events(params.events, params.nevents, &buf); > > + /* Even if failed, we should show the result first */ > > + pr_info("%s", buf.buf); > > if (ret < 0) { > > pr_err_with_code(" Error: Failed to add events.", ret); > > return ret; > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > > index eb5f18b..1a3ed7c 100644 > > --- a/tools/perf/util/probe-event.c > > +++ b/tools/perf/util/probe-event.c > > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev, > > > > static int __add_probe_trace_events(struct perf_probe_event *pev, > > struct probe_trace_event *tevs, > > - int ntevs, bool allow_suffix) > > + int ntevs, bool allow_suffix, > > + struct strbuf *buf) > > { > > int i, fd, ret; > > struct probe_trace_event *tev = NULL; > > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > } > > > > ret = 0; > > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > > + if (buf) > > + strbuf_addf(buf, "Added new event%s\n", > > + (ntevs > 1) ? "s:" : ":"); > > for (i = 0; i < ntevs; i++) { > > tev = &tevs[i]; > > /* Skip if the symbol is out of .text or blacklisted */ > > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > if (ret < 0) > > break; > > > > - /* We use tev's name for showing new events */ > > - show_perf_probe_event(tev->group, tev->event, pev, > > - tev->point.module, false); > > + if (buf) { > > + /* We use tev's name for showing new events */ > > + perf_probe_event__sprintf(tev->group, tev->event, > > + pev, tev->point.module, buf); > > + strbuf_addch(buf, '\n'); > > + } > > /* Save the last valid name */ > > event = tev->event; > > group = tev->group; > > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > warn_uprobe_event_compat(tev); > > > > /* Note that it is possible to skip all events because of blacklist */ > > - if (ret >= 0 && event) { > > + if (ret >= 0 && event && buf) { > > /* 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); > > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n"); > > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event); > > } > > > > strlist__delete(namelist); > > @@ -2765,7 +2771,8 @@ struct __event_package { > > int ntevs; > > }; > > > > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > > + struct strbuf *result) > > { > > int i, j, ret; > > struct __event_package *pkgs; > > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > > for (i = 0; i < npevs; i++) { > > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, > > pkgs[i].ntevs, > > - probe_conf.force_add); > > + probe_conf.force_add, result); > > if (ret < 0) > > break; > > } > > @@ -2819,7 +2826,7 @@ end: > > return ret; > > } > > > > -int del_perf_probe_events(struct strfilter *filter) > > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result) > > { > > int ret, ret2, ufd = -1, kfd = -1; > > char *str = strfilter__string(filter); > > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter) > > if (ret < 0) > > goto out; > > > > - ret = probe_file__del_events(kfd, filter); > > + ret = probe_file__del_events(kfd, filter, result); > > if (ret < 0 && ret != -ENOENT) > > goto error; > > > > - ret2 = probe_file__del_events(ufd, filter); > > + ret2 = probe_file__del_events(ufd, filter, result); > > if (ret2 < 0 && ret2 != -ENOENT) { > > ret = ret2; > > goto error; > > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h > > index 6e7ec68..9855dbf 100644 > > --- a/tools/perf/util/probe-event.h > > +++ b/tools/perf/util/probe-event.h > > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr); > > /* Initialize line range */ > > extern int line_range__init(struct line_range *lr); > > > > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs); > > -extern int del_perf_probe_events(struct strfilter *filter); > > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > > + struct strbuf *result); > > +extern int del_perf_probe_events(struct strfilter *filter, > > + struct strbuf *result); > > extern int show_perf_probe_events(struct strfilter *filter); > > extern int show_line_range(struct line_range *lr, const char *module, > > bool user); > > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c > > index bbb2437..e22fa12 100644 > > --- a/tools/perf/util/probe-file.c > > +++ b/tools/perf/util/probe-file.c > > @@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) > > goto error; > > } > > > > - pr_info("Removed event: %s\n", ent->s); > > return 0; > > error: > > pr_warning("Failed to delete event: %s\n", > > @@ -275,7 +274,7 @@ error: > > return ret; > > } > > > > -int probe_file__del_events(int fd, struct strfilter *filter) > > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf) > > { > > struct strlist *namelist; > > struct str_node *ent; > > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter) > > ret = __del_trace_probe_event(fd, ent); > > if (ret < 0) > > break; > > + if (buf) > > + strbuf_addf(buf, "Removed event: %s\n", ent->s); > > } > > } > > strlist__delete(namelist); > > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h > > index ada94a2..ee89ef0 100644 > > --- a/tools/perf/util/probe-file.h > > +++ b/tools/perf/util/probe-file.h > > @@ -1,6 +1,7 @@ > > #ifndef __PROBE_FILE_H > > #define __PROBE_FILE_H > > > > +#include "strbuf.h" > > #include "strlist.h" > > #include "strfilter.h" > > #include "probe-event.h" > > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag); > > struct strlist *probe_file__get_namelist(int fd); > > struct strlist *probe_file__get_rawlist(int fd); > > int probe_file__add_event(int fd, struct probe_trace_event *tev); > > -int probe_file__del_events(int fd, struct strfilter *filter); > > +int probe_file__del_events(int fd, struct strfilter *filter, > > + struct strbuf *buf); > > > > #endif > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Em Thu, Sep 03, 2015 at 09:10:35PM +0900, Masami Hiramatsu escreveu: > Output the normal result of adding/deleting probe in buildin-probe > instead of showing it by add/del_perf_probe_events. > All the result string is stored into "result" strbuf parameter. > If you want to ignore the result string, pass a NULL to the "result". > Note that all warning/debug strings are still in the > add/del_perf_probe_events. Please provide the before and after output of the affected tools. But I'll wait for you to react to Namyung's RFC. - Arnaldo > Suggested-by: Namhyung Kim <namhyung@gmail.com> > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > --- > tools/perf/builtin-probe.c | 9 +++++++-- > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++------------- > tools/perf/util/probe-event.h | 6 ++++-- > tools/perf/util/probe-file.c | 5 +++-- > tools/perf/util/probe-file.h | 4 +++- > 5 files changed, 37 insertions(+), 20 deletions(-) > > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c > index b81cec3..d11ad21 100644 > --- a/tools/perf/builtin-probe.c > +++ b/tools/perf/builtin-probe.c > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > "Enable kernel symbol demangling"), > OPT_END() > }; > + struct strbuf buf = STRBUF_INIT; > int ret; > > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); > @@ -483,7 +484,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > return ret; > #endif > case 'd': > - ret = del_perf_probe_events(params.filter); > + ret = del_perf_probe_events(params.filter, &buf); > + /* Even if failed, we should show the result first */ > + pr_info("%s", buf.buf); > if (ret < 0) { > pr_err_with_code(" Error: Failed to delete events.", ret); > return ret; > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > usage_with_options(probe_usage, options); > } > > - ret = add_perf_probe_events(params.events, params.nevents); > + ret = add_perf_probe_events(params.events, params.nevents, &buf); > + /* Even if failed, we should show the result first */ > + pr_info("%s", buf.buf); > if (ret < 0) { > pr_err_with_code(" Error: Failed to add events.", ret); > return ret; > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index eb5f18b..1a3ed7c 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev, > > static int __add_probe_trace_events(struct perf_probe_event *pev, > struct probe_trace_event *tevs, > - int ntevs, bool allow_suffix) > + int ntevs, bool allow_suffix, > + struct strbuf *buf) > { > int i, fd, ret; > struct probe_trace_event *tev = NULL; > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > } > > ret = 0; > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > + if (buf) > + strbuf_addf(buf, "Added new event%s\n", > + (ntevs > 1) ? "s:" : ":"); > for (i = 0; i < ntevs; i++) { > tev = &tevs[i]; > /* Skip if the symbol is out of .text or blacklisted */ > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > if (ret < 0) > break; > > - /* We use tev's name for showing new events */ > - show_perf_probe_event(tev->group, tev->event, pev, > - tev->point.module, false); > + if (buf) { > + /* We use tev's name for showing new events */ > + perf_probe_event__sprintf(tev->group, tev->event, > + pev, tev->point.module, buf); > + strbuf_addch(buf, '\n'); > + } > /* Save the last valid name */ > event = tev->event; > group = tev->group; > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > warn_uprobe_event_compat(tev); > > /* Note that it is possible to skip all events because of blacklist */ > - if (ret >= 0 && event) { > + if (ret >= 0 && event && buf) { > /* 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); > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n"); > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event); > } > > strlist__delete(namelist); > @@ -2765,7 +2771,8 @@ struct __event_package { > int ntevs; > }; > > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > + struct strbuf *result) > { > int i, j, ret; > struct __event_package *pkgs; > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > for (i = 0; i < npevs; i++) { > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, > pkgs[i].ntevs, > - probe_conf.force_add); > + probe_conf.force_add, result); > if (ret < 0) > break; > } > @@ -2819,7 +2826,7 @@ end: > return ret; > } > > -int del_perf_probe_events(struct strfilter *filter) > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result) > { > int ret, ret2, ufd = -1, kfd = -1; > char *str = strfilter__string(filter); > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter) > if (ret < 0) > goto out; > > - ret = probe_file__del_events(kfd, filter); > + ret = probe_file__del_events(kfd, filter, result); > if (ret < 0 && ret != -ENOENT) > goto error; > > - ret2 = probe_file__del_events(ufd, filter); > + ret2 = probe_file__del_events(ufd, filter, result); > if (ret2 < 0 && ret2 != -ENOENT) { > ret = ret2; > goto error; > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h > index 6e7ec68..9855dbf 100644 > --- a/tools/perf/util/probe-event.h > +++ b/tools/perf/util/probe-event.h > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr); > /* Initialize line range */ > extern int line_range__init(struct line_range *lr); > > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs); > -extern int del_perf_probe_events(struct strfilter *filter); > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > + struct strbuf *result); > +extern int del_perf_probe_events(struct strfilter *filter, > + struct strbuf *result); > extern int show_perf_probe_events(struct strfilter *filter); > extern int show_line_range(struct line_range *lr, const char *module, > bool user); > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c > index bbb2437..e22fa12 100644 > --- a/tools/perf/util/probe-file.c > +++ b/tools/perf/util/probe-file.c > @@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) > goto error; > } > > - pr_info("Removed event: %s\n", ent->s); > return 0; > error: > pr_warning("Failed to delete event: %s\n", > @@ -275,7 +274,7 @@ error: > return ret; > } > > -int probe_file__del_events(int fd, struct strfilter *filter) > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf) > { > struct strlist *namelist; > struct str_node *ent; > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter) > ret = __del_trace_probe_event(fd, ent); > if (ret < 0) > break; > + if (buf) > + strbuf_addf(buf, "Removed event: %s\n", ent->s); > } > } > strlist__delete(namelist); > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h > index ada94a2..ee89ef0 100644 > --- a/tools/perf/util/probe-file.h > +++ b/tools/perf/util/probe-file.h > @@ -1,6 +1,7 @@ > #ifndef __PROBE_FILE_H > #define __PROBE_FILE_H > > +#include "strbuf.h" > #include "strlist.h" > #include "strfilter.h" > #include "probe-event.h" > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag); > struct strlist *probe_file__get_namelist(int fd); > struct strlist *probe_file__get_rawlist(int fd); > int probe_file__add_event(int fd, struct probe_trace_event *tev); > -int probe_file__del_events(int fd, struct strfilter *filter); > +int probe_file__del_events(int fd, struct strfilter *filter, > + struct strbuf *buf); > > #endif > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
> From: Arnaldo Carvalho de Melo [mailto:acme@kernel.org] > > Em Thu, Sep 03, 2015 at 09:10:35PM +0900, Masami Hiramatsu escreveu: > > Output the normal result of adding/deleting probe in buildin-probe > > instead of showing it by add/del_perf_probe_events. > > All the result string is stored into "result" strbuf parameter. > > If you want to ignore the result string, pass a NULL to the "result". > > Note that all warning/debug strings are still in the > > add/del_perf_probe_events. > > Please provide the before and after output of the affected tools. > > But I'll wait for you to react to Namyung's RFC. Yeah, I think his series is much better than this add-hoc fix :) I'll reply him asap. Thanks! > > - Arnaldo > > > Suggested-by: Namhyung Kim <namhyung@gmail.com> > > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > > --- > > tools/perf/builtin-probe.c | 9 +++++++-- > > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++------------- > > tools/perf/util/probe-event.h | 6 ++++-- > > tools/perf/util/probe-file.c | 5 +++-- > > tools/perf/util/probe-file.h | 4 +++- > > 5 files changed, 37 insertions(+), 20 deletions(-) > > > > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c > > index b81cec3..d11ad21 100644 > > --- a/tools/perf/builtin-probe.c > > +++ b/tools/perf/builtin-probe.c > > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > "Enable kernel symbol demangling"), > > OPT_END() > > }; > > + struct strbuf buf = STRBUF_INIT; > > int ret; > > > > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); > > @@ -483,7 +484,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > return ret; > > #endif > > case 'd': > > - ret = del_perf_probe_events(params.filter); > > + ret = del_perf_probe_events(params.filter, &buf); > > + /* Even if failed, we should show the result first */ > > + pr_info("%s", buf.buf); > > if (ret < 0) { > > pr_err_with_code(" Error: Failed to delete events.", ret); > > return ret; > > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) > > usage_with_options(probe_usage, options); > > } > > > > - ret = add_perf_probe_events(params.events, params.nevents); > > + ret = add_perf_probe_events(params.events, params.nevents, &buf); > > + /* Even if failed, we should show the result first */ > > + pr_info("%s", buf.buf); > > if (ret < 0) { > > pr_err_with_code(" Error: Failed to add events.", ret); > > return ret; > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > > index eb5f18b..1a3ed7c 100644 > > --- a/tools/perf/util/probe-event.c > > +++ b/tools/perf/util/probe-event.c > > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev, > > > > static int __add_probe_trace_events(struct perf_probe_event *pev, > > struct probe_trace_event *tevs, > > - int ntevs, bool allow_suffix) > > + int ntevs, bool allow_suffix, > > + struct strbuf *buf) > > { > > int i, fd, ret; > > struct probe_trace_event *tev = NULL; > > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > } > > > > ret = 0; > > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); > > + if (buf) > > + strbuf_addf(buf, "Added new event%s\n", > > + (ntevs > 1) ? "s:" : ":"); > > for (i = 0; i < ntevs; i++) { > > tev = &tevs[i]; > > /* Skip if the symbol is out of .text or blacklisted */ > > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > if (ret < 0) > > break; > > > > - /* We use tev's name for showing new events */ > > - show_perf_probe_event(tev->group, tev->event, pev, > > - tev->point.module, false); > > + if (buf) { > > + /* We use tev's name for showing new events */ > > + perf_probe_event__sprintf(tev->group, tev->event, > > + pev, tev->point.module, buf); > > + strbuf_addch(buf, '\n'); > > + } > > /* Save the last valid name */ > > event = tev->event; > > group = tev->group; > > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, > > warn_uprobe_event_compat(tev); > > > > /* Note that it is possible to skip all events because of blacklist */ > > - if (ret >= 0 && event) { > > + if (ret >= 0 && event && buf) { > > /* 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); > > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n"); > > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event); > > } > > > > strlist__delete(namelist); > > @@ -2765,7 +2771,8 @@ struct __event_package { > > int ntevs; > > }; > > > > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > > + struct strbuf *result) > > { > > int i, j, ret; > > struct __event_package *pkgs; > > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) > > for (i = 0; i < npevs; i++) { > > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, > > pkgs[i].ntevs, > > - probe_conf.force_add); > > + probe_conf.force_add, result); > > if (ret < 0) > > break; > > } > > @@ -2819,7 +2826,7 @@ end: > > return ret; > > } > > > > -int del_perf_probe_events(struct strfilter *filter) > > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result) > > { > > int ret, ret2, ufd = -1, kfd = -1; > > char *str = strfilter__string(filter); > > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter) > > if (ret < 0) > > goto out; > > > > - ret = probe_file__del_events(kfd, filter); > > + ret = probe_file__del_events(kfd, filter, result); > > if (ret < 0 && ret != -ENOENT) > > goto error; > > > > - ret2 = probe_file__del_events(ufd, filter); > > + ret2 = probe_file__del_events(ufd, filter, result); > > if (ret2 < 0 && ret2 != -ENOENT) { > > ret = ret2; > > goto error; > > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h > > index 6e7ec68..9855dbf 100644 > > --- a/tools/perf/util/probe-event.h > > +++ b/tools/perf/util/probe-event.h > > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr); > > /* Initialize line range */ > > extern int line_range__init(struct line_range *lr); > > > > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs); > > -extern int del_perf_probe_events(struct strfilter *filter); > > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, > > + struct strbuf *result); > > +extern int del_perf_probe_events(struct strfilter *filter, > > + struct strbuf *result); > > extern int show_perf_probe_events(struct strfilter *filter); > > extern int show_line_range(struct line_range *lr, const char *module, > > bool user); > > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c > > index bbb2437..e22fa12 100644 > > --- a/tools/perf/util/probe-file.c > > +++ b/tools/perf/util/probe-file.c > > @@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) > > goto error; > > } > > > > - pr_info("Removed event: %s\n", ent->s); > > return 0; > > error: > > pr_warning("Failed to delete event: %s\n", > > @@ -275,7 +274,7 @@ error: > > return ret; > > } > > > > -int probe_file__del_events(int fd, struct strfilter *filter) > > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf) > > { > > struct strlist *namelist; > > struct str_node *ent; > > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter) > > ret = __del_trace_probe_event(fd, ent); > > if (ret < 0) > > break; > > + if (buf) > > + strbuf_addf(buf, "Removed event: %s\n", ent->s); > > } > > } > > strlist__delete(namelist); > > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h > > index ada94a2..ee89ef0 100644 > > --- a/tools/perf/util/probe-file.h > > +++ b/tools/perf/util/probe-file.h > > @@ -1,6 +1,7 @@ > > #ifndef __PROBE_FILE_H > > #define __PROBE_FILE_H > > > > +#include "strbuf.h" > > #include "strlist.h" > > #include "strfilter.h" > > #include "probe-event.h" > > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag); > > struct strlist *probe_file__get_namelist(int fd); > > struct strlist *probe_file__get_rawlist(int fd); > > int probe_file__add_event(int fd, struct probe_trace_event *tev); > > -int probe_file__del_events(int fd, struct strfilter *filter); > > +int probe_file__del_events(int fd, struct strfilter *filter, > > + struct strbuf *buf); > > > > #endif > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index c3bc0a8..77eeb99 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c @@ -188,6 +188,7 @@ static bool is_probed; int bpf__unprobe(void) { struct strfilter *delfilter; + bool old_silent = probe_conf.silent; int ret; if (!is_probed) @@ -199,7 +200,9 @@ int bpf__unprobe(void) return -ENOMEM; } + probe_conf.silent = true; ret = del_perf_probe_events(delfilter); + probe_conf.silent = old_silent; strfilter__delete(delfilter); if (ret < 0 && is_probed) pr_debug("Error: failed to delete events: %s\n", @@ -215,6 +218,7 @@ int bpf__probe(void) struct bpf_object *obj, *tmp; struct bpf_program *prog; struct perf_probe_event *pevs; + bool old_silent = probe_conf.silent; pevs = calloc(MAX_PROBES, sizeof(pevs[0])); if (!pevs) @@ -235,9 +239,11 @@ int bpf__probe(void) } } + probe_conf.silent = true; probe_conf.max_probes = MAX_PROBES; /* Let add_perf_probe_events generates probe_trace_event (tevs) */ err = add_perf_probe_events(pevs, nr_events, false); + probe_conf.silent = old_silent; /* add_perf_probe_events return negative when fail */ if (err < 0) { diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 57a7bae..e720913 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -52,7 +52,9 @@ #define PERFPROBE_GROUP "probe" bool probe_event_dry_run; /* Dry run flag */ -struct probe_conf probe_conf; +struct probe_conf probe_conf = { + .silent = false, +}; #define semantic_error(msg ...) pr_err("Semantic error :" msg) @@ -2192,10 +2194,12 @@ static int show_perf_probe_event(const char *group, const char *event, ret = perf_probe_event__sprintf(group, event, pev, module, &buf); if (ret >= 0) { - if (use_stdout) + if (use_stdout && !probe_conf.silent) printf("%s\n", buf.buf); - else + else if (!probe_conf.silent) pr_info("%s\n", buf.buf); + else + pr_debug("%s\n", buf.buf); } strbuf_release(&buf); @@ -2418,7 +2422,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, } ret = 0; - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); + if (!probe_conf.silent) + pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); + else + pr_debug("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); for (i = 0; i < ntevs; i++) { tev = &tevs[i]; /* Skip if the symbol is out of .text or blacklisted */ @@ -2454,7 +2461,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev, warn_uprobe_event_compat(tev); /* Note that it is possible to skip all events because of blacklist */ - if (ret >= 0 && event) { + if (ret >= 0 && event && !probe_conf.silent) { /* 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); diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 915f0d8..3ab9c3e 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h @@ -13,6 +13,7 @@ struct probe_conf { bool force_add; bool no_inlines; int max_probes; + bool silent; }; extern struct probe_conf probe_conf; extern bool probe_event_dry_run; diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index bbb2437..db7bd4c 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -267,7 +267,10 @@ static int __del_trace_probe_event(int fd, struct str_node *ent) goto error; } - pr_info("Removed event: %s\n", ent->s); + if (!probe_conf.silent) + pr_info("Removed event: %s\n", ent->s); + else + pr_debug("Removed event: %s\n", ent->s); return 0; error: pr_warning("Failed to delete event: %s\n",
This patch suppresses message output by add_perf_probe_events() and del_perf_probe_events() if they are triggered by BPF loading. Before this patch, when using 'perf record' with BPF object/source as event selector, following message will be output: Added new event: perf_bpf_probe:lock_page_ret (on __lock_page%return) You can now use it in all perf tools, such as: perf record -e perf_bpf_probe:lock_page_ret -aR sleep 1 ... Removed event: perf_bpf_probe:lock_page_ret Which is misleading, especially 'use it in all perf tools' because they will be removed after 'pref record' exit. In this patch, a 'silent' field is appended into probe_conf to control output. bpf__{,un}probe() set it to true when calling {add,del}_perf_probe_events(). Signed-off-by: Wang Nan <wangnan0@huawei.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexei Starovoitov <ast@plumgrid.com> Cc: Brendan Gregg <brendan.d.gregg@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: David Ahern <dsahern@gmail.com> Cc: He Kuang <hekuang@huawei.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kaixu Xia <xiakaixu@huawei.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/n/1440151770-129878-12-git-send-email-wangnan0@huawei.com --- tools/perf/util/bpf-loader.c | 6 ++++++ tools/perf/util/probe-event.c | 17 ++++++++++++----- tools/perf/util/probe-event.h | 1 + tools/perf/util/probe-file.c | 5 ++++- 4 files changed, 23 insertions(+), 6 deletions(-)