diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-07-15 15:22:57 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-07-29 17:34:41 -0400 |
commit | af4a0991f40a1e50e5caff0317f152df2c82bdeb (patch) | |
tree | b04d1087a844ef4fb50d74119aa50f76f6085f23 | |
parent | 2620b7e3696a9470c7cda0a08e55813fd5e57e5c (diff) |
perf evsel: Store backpointer to attached bpf_object
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>
-rw-r--r-- | tools/perf/util/bpf-loader.c | 4 | ||||
-rw-r--r-- | tools/perf/util/bpf-loader.h | 2 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 1 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 3 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 3 |
5 files changed, 9 insertions, 4 deletions
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index c61974a50aa5..6d0dfb777a79 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c | |||
@@ -763,7 +763,7 @@ int bpf__foreach_event(struct bpf_object *obj, | |||
763 | 763 | ||
764 | if (priv->is_tp) { | 764 | if (priv->is_tp) { |
765 | fd = bpf_program__fd(prog); | 765 | fd = bpf_program__fd(prog); |
766 | err = (*func)(priv->sys_name, priv->evt_name, fd, arg); | 766 | err = (*func)(priv->sys_name, priv->evt_name, fd, obj, arg); |
767 | if (err) { | 767 | if (err) { |
768 | pr_debug("bpf: tracepoint call back failed, stop iterate\n"); | 768 | pr_debug("bpf: tracepoint call back failed, stop iterate\n"); |
769 | return err; | 769 | return err; |
@@ -788,7 +788,7 @@ int bpf__foreach_event(struct bpf_object *obj, | |||
788 | return fd; | 788 | return fd; |
789 | } | 789 | } |
790 | 790 | ||
791 | err = (*func)(tev->group, tev->event, fd, arg); | 791 | err = (*func)(tev->group, tev->event, fd, obj, arg); |
792 | if (err) { | 792 | if (err) { |
793 | pr_debug("bpf: call back failed, stop iterate\n"); | 793 | pr_debug("bpf: call back failed, stop iterate\n"); |
794 | return err; | 794 | return err; |
diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h index 3f46856e3330..8c3441a4b72c 100644 --- a/tools/perf/util/bpf-loader.h +++ b/tools/perf/util/bpf-loader.h | |||
@@ -46,7 +46,7 @@ struct parse_events_term; | |||
46 | #define PERF_BPF_PROBE_GROUP "perf_bpf_probe" | 46 | #define PERF_BPF_PROBE_GROUP "perf_bpf_probe" |
47 | 47 | ||
48 | typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event, | 48 | typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event, |
49 | int fd, void *arg); | 49 | int fd, struct bpf_object *obj, void *arg); |
50 | 50 | ||
51 | #ifdef HAVE_LIBBPF_SUPPORT | 51 | #ifdef HAVE_LIBBPF_SUPPORT |
52 | struct bpf_object *bpf__prepare_load(const char *filename, bool source); | 52 | struct bpf_object *bpf__prepare_load(const char *filename, bool source); |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 52459dd5ad0c..7d1757a2ec46 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -234,6 +234,7 @@ void perf_evsel__init(struct perf_evsel *evsel, | |||
234 | evsel->scale = 1.0; | 234 | evsel->scale = 1.0; |
235 | evsel->max_events = ULONG_MAX; | 235 | evsel->max_events = ULONG_MAX; |
236 | evsel->evlist = NULL; | 236 | evsel->evlist = NULL; |
237 | evsel->bpf_obj = NULL; | ||
237 | evsel->bpf_fd = -1; | 238 | evsel->bpf_fd = -1; |
238 | INIT_LIST_HEAD(&evsel->node); | 239 | INIT_LIST_HEAD(&evsel->node); |
239 | INIT_LIST_HEAD(&evsel->config_terms); | 240 | INIT_LIST_HEAD(&evsel->config_terms); |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index cad54e8ba522..b27935a6d36c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -82,6 +82,8 @@ enum perf_tool_event { | |||
82 | PERF_TOOL_DURATION_TIME = 1, | 82 | PERF_TOOL_DURATION_TIME = 1, |
83 | }; | 83 | }; |
84 | 84 | ||
85 | struct bpf_object; | ||
86 | |||
85 | /** struct perf_evsel - event selector | 87 | /** struct perf_evsel - event selector |
86 | * | 88 | * |
87 | * @evlist - evlist this evsel is in, if it is in one. | 89 | * @evlist - evlist this evsel is in, if it is in one. |
@@ -152,6 +154,7 @@ struct perf_evsel { | |||
152 | char *group_name; | 154 | char *group_name; |
153 | bool cmdline_group_boundary; | 155 | bool cmdline_group_boundary; |
154 | struct list_head config_terms; | 156 | struct list_head config_terms; |
157 | struct bpf_object *bpf_obj; | ||
155 | int bpf_fd; | 158 | int bpf_fd; |
156 | bool auto_merge_stats; | 159 | bool auto_merge_stats; |
157 | bool merged_stat; | 160 | bool merged_stat; |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index fac6b32ef94a..0540303e5e97 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -630,7 +630,7 @@ struct __add_bpf_event_param { | |||
630 | struct list_head *head_config; | 630 | struct list_head *head_config; |
631 | }; | 631 | }; |
632 | 632 | ||
633 | static int add_bpf_event(const char *group, const char *event, int fd, | 633 | static int add_bpf_event(const char *group, const char *event, int fd, struct bpf_object *obj, |
634 | void *_param) | 634 | void *_param) |
635 | { | 635 | { |
636 | LIST_HEAD(new_evsels); | 636 | LIST_HEAD(new_evsels); |
@@ -672,6 +672,7 @@ static int add_bpf_event(const char *group, const char *event, int fd, | |||
672 | pr_debug("adding %s:%s to %p\n", | 672 | pr_debug("adding %s:%s to %p\n", |
673 | group, event, pos); | 673 | group, event, pos); |
674 | pos->bpf_fd = fd; | 674 | pos->bpf_fd = fd; |
675 | pos->bpf_obj = obj; | ||
675 | } | 676 | } |
676 | list_splice(&new_evsels, list); | 677 | list_splice(&new_evsels, list); |
677 | return 0; | 678 | return 0; |