RE: [PATCH 2/5] perf probe: Attach trace_probe_event with perf_probe_event

From: åæéå / HIRAMATUïMASAMI
Date: Fri Sep 04 2015 - 07:37:09 EST


> From: Namhyung Kim [mailto:namhyung@xxxxxxxxxx]
>
> 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.pt@xxxxxxxxxxx>

Thanks!

>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx>
> Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
> [namhyung: extract necessary part from the existing patch]
> Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> ---
> 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‹§²æ¸›yú²X¬¶ÇvØ–)Þ{.nlj·¥Š{±‘êX§¶›¡Ü}©ž²ÆzÚj:+v‰¨¾«‘êZ+€Êzf£¢·hšˆ§~†­†Ûÿû®w¥¢¸?™¨è&¢)ßf”ùy§m…á«a¶Úÿ 0¶ìå