]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
perf bpf: Decouple creating the evlist from adding the SB event
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 24 Apr 2020 15:24:51 +0000 (12:24 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 5 May 2020 19:35:29 +0000 (16:35 -0300)
Renaming bpf_event__add_sb_event() to evlist__add_sb_event() and
requiring that the evlist be allocated beforehand.

This will allow using the same side band thread and evlist to be used
for multiple purposes in addition to react to PERF_RECORD_BPF_EVENT soon
after they are generated.

Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Song Liu <songliubraving@fb.com>
Link: http://lore.kernel.org/lkml/20200429131106.27974-4-acme@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c
tools/perf/builtin-top.c
tools/perf/util/bpf-event.c
tools/perf/util/bpf-event.h
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index a6d887d97cebf437a3a57923573c17954f4f0941..5b6a1d23efe5c6a29ee9669333a44f848c791219 100644 (file)
@@ -1573,16 +1573,27 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
                        goto out_child;
        }
 
+       err = -1;
        if (!rec->no_buildid
            && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
                pr_err("Couldn't generate buildids. "
                       "Use --no-buildid to profile anyway.\n");
-               err = -1;
                goto out_child;
        }
 
-       if (!opts->no_bpf_event)
-               bpf_event__add_sb_event(&rec->sb_evlist, &session->header.env);
+       if (!opts->no_bpf_event) {
+               rec->sb_evlist = evlist__new();
+
+               if (rec->sb_evlist == NULL) {
+                       pr_err("Couldn't create side band evlist.\n.");
+                       goto out_child;
+               }
+
+               if (evlist__add_bpf_sb_event(rec->sb_evlist, &session->header.env)) {
+                       pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
+                       goto out_child;
+               }
+       }
 
        if (perf_evlist__start_sb_thread(rec->sb_evlist, &rec->opts.target)) {
                pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n");
index 70e1c732db6a044501de1a51e2fd26478c3be9ef..de24aced721353785f181f4a1ce3d779b2ff03d9 100644 (file)
@@ -1742,8 +1742,19 @@ int cmd_top(int argc, const char **argv)
                goto out_delete_evlist;
        }
 
-       if (!top.record_opts.no_bpf_event)
-               bpf_event__add_sb_event(&top.sb_evlist, &perf_env);
+       if (!top.record_opts.no_bpf_event) {
+               top.sb_evlist = evlist__new();
+
+               if (top.sb_evlist == NULL) {
+                       pr_err("Couldn't create side band evlist.\n.");
+                       goto out_delete_evlist;
+               }
+
+               if (evlist__add_bpf_sb_event(top.sb_evlist, &perf_env)) {
+                       pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
+                       goto out_delete_evlist;
+               }
+       }
 
        if (perf_evlist__start_sb_thread(top.sb_evlist, target)) {
                pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n");
index 0cd41a862952e4febd588d43ce97391dad05acd6..3742511a08d15cc942e041a45caebc32eb5dd1b2 100644 (file)
@@ -509,8 +509,7 @@ static int bpf_event__sb_cb(union perf_event *event, void *data)
        return 0;
 }
 
-int bpf_event__add_sb_event(struct evlist **evlist,
-                           struct perf_env *env)
+int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env)
 {
        struct perf_event_attr attr = {
                .type             = PERF_TYPE_SOFTWARE,
index 81fdc88e6c1a879062e8b36b4af013522bce7688..68f315c3df5bed03c85b7d4e758fe0fd66d7e3bc 100644 (file)
@@ -33,8 +33,7 @@ struct btf_node {
 #ifdef HAVE_LIBBPF_SUPPORT
 int machine__process_bpf(struct machine *machine, union perf_event *event,
                         struct perf_sample *sample);
-int bpf_event__add_sb_event(struct evlist **evlist,
-                                struct perf_env *env);
+int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env);
 void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info,
                                    struct perf_env *env,
                                    FILE *fp);
@@ -46,8 +45,8 @@ static inline int machine__process_bpf(struct machine *machine __maybe_unused,
        return 0;
 }
 
-static inline int bpf_event__add_sb_event(struct evlist **evlist __maybe_unused,
-                                         struct perf_env *env __maybe_unused)
+static inline int evlist__add_bpf_sb_event(struct evlist *evlist __maybe_unused,
+                                          struct perf_env *env __maybe_unused)
 {
        return 0;
 }
index 3f7e7d5f008bbfe71fe8f9fdd8df187ae0a7282b..6fe11f4d856a535105a95e3c9290f30ac45ee805 100644 (file)
@@ -1705,39 +1705,26 @@ struct evsel *perf_evlist__reset_weak_group(struct evlist *evsel_list,
        return leader;
 }
 
-int perf_evlist__add_sb_event(struct evlist **evlist,
+int perf_evlist__add_sb_event(struct evlist *evlist,
                              struct perf_event_attr *attr,
                              perf_evsel__sb_cb_t cb,
                              void *data)
 {
        struct evsel *evsel;
-       bool new_evlist = (*evlist) == NULL;
-
-       if (*evlist == NULL)
-               *evlist = evlist__new();
-       if (*evlist == NULL)
-               return -1;
 
        if (!attr->sample_id_all) {
                pr_warning("enabling sample_id_all for all side band events\n");
                attr->sample_id_all = 1;
        }
 
-       evsel = perf_evsel__new_idx(attr, (*evlist)->core.nr_entries);
+       evsel = perf_evsel__new_idx(attr, evlist->core.nr_entries);
        if (!evsel)
-               goto out_err;
+               return -1;
 
        evsel->side_band.cb = cb;
        evsel->side_band.data = data;
-       evlist__add(*evlist, evsel);
+       evlist__add(evlist, evsel);
        return 0;
-
-out_err:
-       if (new_evlist) {
-               evlist__delete(*evlist);
-               *evlist = NULL;
-       }
-       return -1;
 }
 
 static void *perf_evlist__poll_thread(void *arg)
index 48622e5939728d5b8d29c0ab4b163034934cf773..a9d01a11570a36e4e3518f1db5d78762db15d149 100644 (file)
@@ -107,7 +107,7 @@ int __perf_evlist__add_default_attrs(struct evlist *evlist,
 
 int perf_evlist__add_dummy(struct evlist *evlist);
 
-int perf_evlist__add_sb_event(struct evlist **evlist,
+int perf_evlist__add_sb_event(struct evlist *evlist,
                              struct perf_event_attr *attr,
                              perf_evsel__sb_cb_t cb,
                              void *data);