This patch drops struct __event_package structure. Instead, it adds
trace_probe_event into 'struct perf_probe_event'.

trace_probe_event information give further patches a chance to access
actual probe points and actual arguments. Using them, bpf_loader will
be able to attach one bpf program to different probing points of a
inline functions (which has multiple probing points) and glob
functions. Moreover, by reading arguments information, bpf code for
reading those arguments can be generated.

Signed-off-by: Wang Nan <wangn...@huawei.com>
---
 tools/perf/builtin-probe.c    |  2 +-
 tools/perf/util/probe-event.c | 57 +++++++++++++++++++++----------------------
 tools/perf/util/probe-event.h |  5 +++-
 3 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 1272559..0218725 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -497,7 +497,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 = add_perf_probe_events(params.events, params.nevents, 
true);
                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 d4cf50b..1609a5e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1878,6 +1878,9 @@ void clear_perf_probe_event(struct perf_probe_event *pev)
        struct perf_probe_arg_field *field, *next;
        int i;
 
+       if (pev->ntevs)
+               cleanup_perf_probe_event(pev);
+
        free(pev->event);
        free(pev->group);
        free(pev->target);
@@ -2685,56 +2688,52 @@ 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;
-};
-
-int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
+int cleanup_perf_probe_event(struct perf_probe_event *pev)
 {
-       int i, j, ret;
-       struct __event_package *pkgs;
+       int i;
 
-       ret = 0;
-       pkgs = zalloc(sizeof(struct __event_package) * npevs);
+       if (!pev || !pev->ntevs)
+               return 0;
 
-       if (pkgs == NULL)
-               return -ENOMEM;
+       for (i = 0; i < pev->ntevs; i++)
+               clear_probe_trace_event(&pev->tevs[i]);
+
+       zfree(&pev->tevs);
+       pev->ntevs = 0;
+       return 0;
+}
+
+int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, bool 
cleanup)
+{
+       int i, ret;
 
        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];
                /* Convert with or without debuginfo */
-               ret  = convert_to_probe_trace_events(pkgs[i].pev,
-                                                    &pkgs[i].tevs);
-               if (ret < 0)
+               ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
+               if (ret < 0) {
+                       cleanup = true;
                        goto end;
-               pkgs[i].ntevs = ret;
+               }
+               pevs[i].ntevs = ret;
        }
 
        /* 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;
        }
 end:
        /* 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);
-       }
-       free(pkgs);
+       for (i = 0; cleanup && (i < npevs); i++)
+               cleanup_perf_probe_event(&pevs[i]);
        exit_symbol_maps();
 
        return ret;
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 31db6ee..40dd22b 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -86,6 +86,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 */
@@ -131,8 +133,9 @@ extern void line_range__clear(struct line_range *lr);
 /* Initialize line range */
 extern int line_range__init(struct line_range *lr);
 
-extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 
bool cleanup);
 extern int del_perf_probe_events(struct strfilter *filter);
+extern int cleanup_perf_probe_event(struct perf_probe_event *pev);
 extern int show_perf_probe_events(struct strfilter *filter);
 extern int show_line_range(struct line_range *lr, const char *module,
                           bool user);
-- 
1.8.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to