> From: Namhyung Kim [mailto:[email protected]]
> 
> Showing actual trace event when adding perf events is only needed in
> perf probe command.  But the add functionality itself can be used by
> other places.  So move the printing code into the cmd_probe().
> 
> Also it combines the output if more than one event is added.
> 
> Before:
>   $ sudo perf probe -a do_fork -a do_exit
>   Added new event:
>   probe:do_fork        (on do_fork)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_fork -aR sleep 1
> 
>   Added new events:
>   probe:do_exit        (on do_exit)
>   probe:do_exit_1      (on do_exit)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_exit_1 -aR sleep 1
> 
> After:
>   $ sudo perf probe -a do_fork -a do_exit
>   Added new events:
>   probe:do_fork        (on do_fork)
>   probe:do_exit        (on do_exit)
>   probe:do_exit_1      (on do_exit)
> 
>   You can now use it in all perf tools, such as:
> 
>       perf record -e probe:do_exit_1 -aR sleep 1
> 

Looks good to me :)

Acked-by: Masami Hiramatsu <[email protected]>

Thanks!

> Cc: Masami Hiramatsu <[email protected]>
> Signed-off-by: Namhyung Kim <[email protected]>
> ---
>  tools/perf/builtin-probe.c    | 48 
> ++++++++++++++++++++++++++++++++++++++++++-
>  tools/perf/util/probe-event.c | 22 +++-----------------
>  tools/perf/util/probe-event.h |  3 +++
>  3 files changed, 53 insertions(+), 20 deletions(-)
> 
> diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> index b81cec33b4b2..b8cf6cb7e1bf 100644
> --- a/tools/perf/builtin-probe.c
> +++ b/tools/perf/builtin-probe.c
> @@ -311,6 +311,52 @@ static void pr_err_with_code(const char *msg, int err)
>       pr_err("\n");
>  }
> 
> +static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs)
> +{
> +     int ret;
> +     int i, k;
> +     const char *event = NULL, *group = NULL;
> +
> +     ret = convert_perf_probe_events(pevs, npevs);
> +     if (ret < 0)
> +             goto out_cleanup;
> +
> +     ret = apply_perf_probe_events(pevs, npevs);
> +     if (ret < 0)
> +             goto out_cleanup;
> +
> +     for (i = k = 0; i < npevs; i++)
> +             k += pevs[i].ntevs;
> +
> +     pr_info("Added new event%s\n", (k > 1) ? "s:" : ":");
> +     for (i = 0; i < npevs; i++) {
> +             struct perf_probe_event *pev = &pevs[i];
> +
> +             for (k = 0; k < pev->ntevs; k++) {
> +                     struct probe_trace_event *tev = &pev->tevs[k];
> +
> +                     /* We use tev's name for showing new events */
> +                     show_perf_probe_event(tev->group, tev->event, pev,
> +                                           tev->point.module, false);
> +
> +                     /* Save the last valid name */
> +                     event = tev->event;
> +                     group = tev->group;
> +             }
> +     }
> +
> +     /* Note that it is possible to skip all events because of blacklist */
> +     if (event) {
> +             /* 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);
> +     }
> +
> +out_cleanup:
> +     cleanup_perf_probe_events(pevs, npevs);
> +     return ret;
> +}
> +
>  static int
>  __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
>  {
> @@ -496,7 +542,7 @@ __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 = perf_add_probe_events(params.events, params.nevents);
>               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 0d3a051b9202..01b9a5bd9449 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -2180,9 +2180,9 @@ static int perf_probe_event__sprintf(const char *group, 
> const char *event,
>  }
> 
>  /* Show an event */
> -static int show_perf_probe_event(const char *group, const char *event,
> -                              struct perf_probe_event *pev,
> -                              const char *module, bool use_stdout)
> +int show_perf_probe_event(const char *group, const char *event,
> +                       struct perf_probe_event *pev,
> +                       const char *module, bool use_stdout)
>  {
>       struct strbuf buf = STRBUF_INIT;
>       int ret;
> @@ -2399,7 +2399,6 @@ static int __add_probe_trace_events(struct 
> perf_probe_event *pev,
>  {
>       int i, fd, ret;
>       struct probe_trace_event *tev = NULL;
> -     const char *event = NULL, *group = NULL;
>       struct strlist *namelist;
> 
>       fd = probe_file__open(PF_FL_RW | (pev->uprobes ? PF_FL_UPROBE : 0));
> @@ -2415,7 +2414,6 @@ static int __add_probe_trace_events(struct 
> perf_probe_event *pev,
>       }
> 
>       ret = 0;
> -     pr_info("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,13 +2430,6 @@ 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);
> -             /* Save the last valid name */
> -             event = tev->event;
> -             group = tev->group;
> -
>               /*
>                * Probes after the first probe which comes from same
>                * user input are always allowed to add suffix, because
> @@ -2450,13 +2441,6 @@ static int __add_probe_trace_events(struct 
> perf_probe_event *pev,
>       if (ret == -EINVAL && pev->uprobes)
>               warn_uprobe_event_compat(tev);
> 
> -     /* Note that it is possible to skip all events because of blacklist */
> -     if (ret >= 0 && event) {
> -             /* 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);
> -     }
> -
>       strlist__delete(namelist);
>  close_out:
>       close(fd);
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 70c327bd61de..610f743671e1 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -144,6 +144,9 @@ extern int convert_perf_probe_events(struct 
> perf_probe_event *pevs, int npevs);
>  extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
>  extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int 
> npevs);
>  extern int del_perf_probe_events(struct strfilter *filter);
> +extern int show_perf_probe_event(const char *group, const char *event,
> +                              struct perf_probe_event *pev,
> +                              const char *module, bool use_stdout);
>  extern int show_perf_probe_events(struct strfilter *filter);
>  extern int show_line_range(struct line_range *lr, const char *module,
>                          bool user);
> --
> 2.5.0

N�����r��y����b�X��ǧv�^�)޺{.n�+����{����zX����ܨ}���Ơz�&j:+v�������zZ+��+zf���h���~����i���z��w���?�����&�)ߢf��^jǫy�m��@A�a���
0��h���i

Reply via email to