static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, struct thread_map *threads) { int cpu, thread; if (evsel->fd == NULL && perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) return -1; for (cpu = 0; cpu < cpus->nr; cpu++) { for (thread = 0; thread < threads->nr; thread++) { FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, threads->map[thread], cpus->map[cpu], -1, 0); if (FD(evsel, cpu, thread) < 0) goto out_close; } } return 0; out_close: do { while (--thread >= 0) { close(FD(evsel, cpu, thread)); FD(evsel, cpu, thread) = -1; } thread = threads->nr; } while (--cpu >= 0); return -1; }
static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, struct thread_map *threads, bool group, struct xyarray *group_fds) { int cpu, thread; unsigned long flags = 0; int pid = -1, err; if (evsel->fd == NULL && perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) return -ENOMEM; if (evsel->cgrp) { flags = PERF_FLAG_PID_CGROUP; pid = evsel->cgrp->fd; } for (cpu = 0; cpu < cpus->nr; cpu++) { int group_fd = group_fds ? GROUP_FD(group_fds, cpu) : -1; for (thread = 0; thread < threads->nr; thread++) { if (!evsel->cgrp) pid = threads->map[thread]; FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr, pid, cpus->map[cpu], group_fd, flags); if (FD(evsel, cpu, thread) < 0) { err = -errno; goto out_close; } if (group && group_fd == -1) group_fd = FD(evsel, cpu, thread); } } return 0; out_close: do { while (--thread >= 0) { close(FD(evsel, cpu, thread)); FD(evsel, cpu, thread) = -1; } thread = threads->nr; } while (--cpu >= 0); return err; }