Messages in this thread Patch in this message | | | From | 平松雅巳 / HIRAMATU,MASAMI <> | Subject | RE: [PATCH 2/5] perf probe: Attach trace_probe_event with perf_probe_event | Date | Fri, 4 Sep 2015 11:36:56 +0000 |
| |
> From: Namhyung Kim [mailto:namhyung@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.pt@hitachi.com>
Thanks!
> > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > Signed-off-by: Wang Nan <wangnan0@huawei.com> > [namhyung: extract necessary part from the existing patch] > Signed-off-by: Namhyung Kim <namhyung@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
| |