lkml.org 
[lkml]   [2015]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v10 37/50] perf tools: Suppress probing messages when probing by BPF loading
    Date
    This patch suppress 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>
    ---
    tools/perf/util/bpf-loader.c | 6 ++++++
    tools/perf/util/probe-event.c | 22 ++++++++++++++++------
    tools/perf/util/probe-event.h | 1 +
    3 files changed, 23 insertions(+), 6 deletions(-)

    diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
    index 0bc12c2..197e4a3 100644
    --- a/tools/perf/util/bpf-loader.c
    +++ b/tools/perf/util/bpf-loader.c
    @@ -199,6 +199,7 @@ static bool is_probing;
    int bpf__unprobe(void)
    {
    struct strfilter *delfilter;
    + bool old_silent = probe_conf.silent;
    int ret;

    if (!is_probing)
    @@ -210,7 +211,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_probing)
    pr_err("Error: failed to delete events: %s\n",
    @@ -223,15 +226,18 @@ int bpf__unprobe(void)
    int bpf__probe(void)
    {
    int err;
    + bool old_silent = probe_conf.silent;

    if (nr_probe_events <= 0)
    return 0;

    + probe_conf.silent = true;
    probe_conf.max_probes = MAX_PROBES;
    /* Let add_perf_probe_events keeps probe_trace_event */
    err = add_perf_probe_events(probe_event_array,
    nr_probe_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 083e8b4..b9573c5 100644
    --- a/tools/perf/util/probe-event.c
    +++ b/tools/perf/util/probe-event.c
    @@ -51,7 +51,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)

    @@ -2250,10 +2252,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);

    @@ -2512,7 +2516,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,

    safename = (pev->point.function && !strisglob(pev->point.function));
    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 */
    @@ -2569,7 +2576,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);
    @@ -2865,7 +2872,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",
    diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
    index 4b7a951..116b0aa 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;
    --
    1.8.3.4


    \
     
     \ /
      Last update: 2015-07-01 04:41    [W:5.010 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site