]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - tools/perf/util/evlist.c
perf evlist: Fix grouping of multiple events
[karo-tx-linux.git] / tools / perf / util / evlist.c
index 72e9f4886b6d062f1d239a78de3c03f4c52f797c..fbb4b4ab9cc6925a57017abc3087eab9b3b12ff4 100644 (file)
@@ -533,3 +533,39 @@ bool perf_evlist__sample_id_all(const struct perf_evlist *evlist)
        first = list_entry(evlist->entries.next, struct perf_evsel, node);
        return first->attr.sample_id_all;
 }
+
+void perf_evlist__set_selected(struct perf_evlist *evlist,
+                              struct perf_evsel *evsel)
+{
+       evlist->selected = evsel;
+}
+
+int perf_evlist__open(struct perf_evlist *evlist, bool group)
+{
+       struct perf_evsel *evsel, *first;
+       int err, ncpus, nthreads;
+
+       first = list_entry(evlist->entries.next, struct perf_evsel, node);
+
+       list_for_each_entry(evsel, &evlist->entries, node) {
+               struct xyarray *group_fd = NULL;
+
+               if (group && evsel != first)
+                       group_fd = first->fd;
+
+               err = perf_evsel__open(evsel, evlist->cpus, evlist->threads,
+                                      group, group_fd);
+               if (err < 0)
+                       goto out_err;
+       }
+
+       return 0;
+out_err:
+       ncpus = evlist->cpus ? evlist->cpus->nr : 1;
+       nthreads = evlist->threads ? evlist->threads->nr : 1;
+
+       list_for_each_entry_reverse(evsel, &evlist->entries, node)
+               perf_evsel__close(evsel, ncpus, nthreads);
+
+       return err;
+}