diff options
Diffstat (limited to 'tools/perf/util/evlist.c')
-rw-r--r-- | tools/perf/util/evlist.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 2f6bc89027da..fbb4b4ab9cc6 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -539,3 +539,33 @@ void perf_evlist__set_selected(struct perf_evlist *evlist, | |||
539 | { | 539 | { |
540 | evlist->selected = evsel; | 540 | evlist->selected = evsel; |
541 | } | 541 | } |
542 | |||
543 | int perf_evlist__open(struct perf_evlist *evlist, bool group) | ||
544 | { | ||
545 | struct perf_evsel *evsel, *first; | ||
546 | int err, ncpus, nthreads; | ||
547 | |||
548 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
549 | |||
550 | list_for_each_entry(evsel, &evlist->entries, node) { | ||
551 | struct xyarray *group_fd = NULL; | ||
552 | |||
553 | if (group && evsel != first) | ||
554 | group_fd = first->fd; | ||
555 | |||
556 | err = perf_evsel__open(evsel, evlist->cpus, evlist->threads, | ||
557 | group, group_fd); | ||
558 | if (err < 0) | ||
559 | goto out_err; | ||
560 | } | ||
561 | |||
562 | return 0; | ||
563 | out_err: | ||
564 | ncpus = evlist->cpus ? evlist->cpus->nr : 1; | ||
565 | nthreads = evlist->threads ? evlist->threads->nr : 1; | ||
566 | |||
567 | list_for_each_entry_reverse(evsel, &evlist->entries, node) | ||
568 | perf_evsel__close(evsel, ncpus, nthreads); | ||
569 | |||
570 | return err; | ||
571 | } | ||