perf evsel: Store backpointer to attached bpf_object
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 15 Jul 2019 19:22:57 +0000 (16:22 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 29 Jul 2019 21:34:41 +0000 (18:34 -0300)
We may want to get to this bpf_object, to search for other BPF programs,
etc.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-3y8hrb6lszjfi23vjlic3cib@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/bpf-loader.c
tools/perf/util/bpf-loader.h
tools/perf/util/evsel.c
tools/perf/util/evsel.h
tools/perf/util/parse-events.c

index c61974a..6d0dfb7 100644 (file)
@@ -763,7 +763,7 @@ int bpf__foreach_event(struct bpf_object *obj,
 
                if (priv->is_tp) {
                        fd = bpf_program__fd(prog);
-                       err = (*func)(priv->sys_name, priv->evt_name, fd, arg);
+                       err = (*func)(priv->sys_name, priv->evt_name, fd, obj, arg);
                        if (err) {
                                pr_debug("bpf: tracepoint call back failed, stop iterate\n");
                                return err;
@@ -788,7 +788,7 @@ int bpf__foreach_event(struct bpf_object *obj,
                                return fd;
                        }
 
-                       err = (*func)(tev->group, tev->event, fd, arg);
+                       err = (*func)(tev->group, tev->event, fd, obj, arg);
                        if (err) {
                                pr_debug("bpf: call back failed, stop iterate\n");
                                return err;
index 3f46856..8c3441a 100644 (file)
@@ -46,7 +46,7 @@ struct parse_events_term;
 #define PERF_BPF_PROBE_GROUP "perf_bpf_probe"
 
 typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event,
-                                       int fd, void *arg);
+                                       int fd, struct bpf_object *obj, void *arg);
 
 #ifdef HAVE_LIBBPF_SUPPORT
 struct bpf_object *bpf__prepare_load(const char *filename, bool source);
index 52459dd..7d1757a 100644 (file)
@@ -234,6 +234,7 @@ void perf_evsel__init(struct perf_evsel *evsel,
        evsel->scale       = 1.0;
        evsel->max_events  = ULONG_MAX;
        evsel->evlist      = NULL;
+       evsel->bpf_obj     = NULL;
        evsel->bpf_fd      = -1;
        INIT_LIST_HEAD(&evsel->node);
        INIT_LIST_HEAD(&evsel->config_terms);
index cad54e8..b27935a 100644 (file)
@@ -82,6 +82,8 @@ enum perf_tool_event {
        PERF_TOOL_DURATION_TIME = 1,
 };
 
+struct bpf_object;
+
 /** struct perf_evsel - event selector
  *
  * @evlist - evlist this evsel is in, if it is in one.
@@ -152,6 +154,7 @@ struct perf_evsel {
        char                    *group_name;
        bool                    cmdline_group_boundary;
        struct list_head        config_terms;
+       struct bpf_object       *bpf_obj;
        int                     bpf_fd;
        bool                    auto_merge_stats;
        bool                    merged_stat;
index fac6b32..0540303 100644 (file)
@@ -630,7 +630,7 @@ struct __add_bpf_event_param {
        struct list_head *head_config;
 };
 
-static int add_bpf_event(const char *group, const char *event, int fd,
+static int add_bpf_event(const char *group, const char *event, int fd, struct bpf_object *obj,
                         void *_param)
 {
        LIST_HEAD(new_evsels);
@@ -672,6 +672,7 @@ static int add_bpf_event(const char *group, const char *event, int fd,
                pr_debug("adding %s:%s to %p\n",
                         group, event, pos);
                pos->bpf_fd = fd;
+               pos->bpf_obj = obj;
        }
        list_splice(&new_evsels, list);
        return 0;