> From: Namhyung Kim [mailto:namhy...@kernel.org]
> 
> This patch drops struct __event_package structure.  Instead, it adds
> trace_probe_event into 'struct perf_probe_event'.
> 
> trace_probe_event information gives further patches a chance to access
> actual probe points and actual arguments.  Using them, perf probe can
> get whole list of added probes and print them at once.
> 
> Other users like upcoming bpf_loader will be able to attach one bpf
> program to different probing points of an inline functions (which has
> multiple probing points) and glob functions.  Moreover, by reading
> arguments information, bpf code for reading those arguments can be
> generated.

Looks good to me.

Acked-by: Masami Hiramatsu <masami.hiramatsu...@hitachi.com>

Thanks!

> 
> Cc: Masami Hiramatsu <masami.hiramatsu...@hitachi.com>
> Signed-off-by: Wang Nan <wangn...@huawei.com>
> [namhyung: extract necessary part from the existing patch]
> Signed-off-by: Namhyung Kim <namhy...@kernel.org>
> ---
>  tools/perf/util/probe-event.c | 57 
> +++++++++++++------------------------------
>  tools/perf/util/probe-event.h |  5 ++++
>  2 files changed, 22 insertions(+), 40 deletions(-)
> 
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 2c762f41e7a5..0d3a051b9202 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -2759,59 +2759,39 @@ static int convert_to_probe_trace_events(struct 
> perf_probe_event *pev,
>       return find_probe_trace_events_from_map(pev, tevs);
>  }
> 
> -struct __event_package {
> -     struct perf_probe_event         *pev;
> -     struct probe_trace_event        *tevs;
> -     int                             ntevs;
> -};
> -
> -static int convert_perf_probe_events(struct perf_probe_event *pevs, int 
> npevs,
> -                                  struct __event_package **ppkgs)
> +int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>       int i, ret;
> -     struct __event_package *pkgs;
> -
> -     ret = 0;
> -     pkgs = zalloc(sizeof(struct __event_package) * npevs);
> -
> -     if (pkgs == NULL)
> -             return -ENOMEM;
> 
>       ret = init_symbol_maps(pevs->uprobes);
> -     if (ret < 0) {
> -             free(pkgs);
> +     if (ret < 0)
>               return ret;
> -     }
> 
>       /* Loop 1: convert all events */
>       for (i = 0; i < npevs; i++) {
> -             pkgs[i].pev = &pevs[i];
>               /* Init kprobe blacklist if needed */
> -             if (!pkgs[i].pev->uprobes)
> +             if (!pevs[i].uprobes)
>                       kprobe_blacklist__init();
>               /* Convert with or without debuginfo */
> -             ret  = convert_to_probe_trace_events(pkgs[i].pev,
> -                                                  &pkgs[i].tevs);
> +             ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
>               if (ret < 0)
>                       return ret;
> -             pkgs[i].ntevs = ret;
> +             pevs[i].ntevs = ret;
>       }
>       /* This just release blacklist only if allocated */
>       kprobe_blacklist__release();
> 
> -     *ppkgs = pkgs;
> -
>       return 0;
>  }
> 
> -static int apply_perf_probe_events(struct __event_package *pkgs, int npevs)
> +int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>       int i, ret = 0;
> 
>       /* Loop 2: add all events */
>       for (i = 0; i < npevs; i++) {
> -             ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
> -                                            pkgs[i].ntevs,
> +             ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs,
> +                                            pevs[i].ntevs,
>                                              probe_conf.force_add);
>               if (ret < 0)
>                       break;
> @@ -2819,33 +2799,30 @@ static int apply_perf_probe_events(struct 
> __event_package *pkgs, int npevs)
>       return ret;
>  }
> 
> -static void cleanup_perf_probe_events(struct __event_package *pkgs, int 
> npevs)
> +void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>       int i, j;
> 
> -     if (pkgs == NULL)
> -             return;
> -
>       /* Loop 3: cleanup and free trace events  */
>       for (i = 0; i < npevs; i++) {
> -             for (j = 0; j < pkgs[i].ntevs; j++)
> -                     clear_probe_trace_event(&pkgs[i].tevs[j]);
> -             zfree(&pkgs[i].tevs);
> +             for (j = 0; j < pevs[i].ntevs; j++)
> +                     clear_probe_trace_event(&pevs[i].tevs[j]);
> +             zfree(&pevs[i].tevs);
> +             pevs[i].ntevs = 0;
>       }
> -     free(pkgs);
> +
>       exit_symbol_maps();
>  }
> 
>  int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
>  {
>       int ret;
> -     struct __event_package *pkgs = NULL;
> 
> -     ret = convert_perf_probe_events(pevs, npevs, &pkgs);
> +     ret = convert_perf_probe_events(pevs, npevs);
>       if (ret == 0)
> -             ret = apply_perf_probe_events(pkgs, npevs);
> +             ret = apply_perf_probe_events(pevs, npevs);
> 
> -     cleanup_perf_probe_events(pkgs, npevs);
> +     cleanup_perf_probe_events(pevs, npevs);
> 
>       return ret;
>  }
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 6e7ec68a4aa8..70c327bd61de 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -87,6 +87,8 @@ struct perf_probe_event {
>       bool                    uprobes;        /* Uprobe event flag */
>       char                    *target;        /* Target binary */
>       struct perf_probe_arg   *args;  /* Arguments */
> +     struct probe_trace_event *tevs;
> +     int                     ntevs;
>  };
> 
>  /* Line range */
> @@ -138,6 +140,9 @@ extern void line_range__clear(struct line_range *lr);
>  extern int line_range__init(struct line_range *lr);
> 
>  extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
> +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_events(struct strfilter *filter);
>  extern int show_line_range(struct line_range *lr, const char *module,
> --
> 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