diff options
Diffstat (limited to 'tools/lib/perf')
| -rw-r--r-- | tools/lib/perf/evsel.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index c1d58673f6ef..952f3520d5c2 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -149,23 +149,30 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,  			int fd, group_fd, *evsel_fd;  			evsel_fd = FD(evsel, idx, thread); -			if (evsel_fd == NULL) -				return -EINVAL; +			if (evsel_fd == NULL) { +				err = -EINVAL; +				goto out; +			}  			err = get_group_fd(evsel, idx, thread, &group_fd);  			if (err < 0) -				return err; +				goto out;  			fd = sys_perf_event_open(&evsel->attr,  						 threads->map[thread].pid,  						 cpu, group_fd, 0); -			if (fd < 0) -				return -errno; +			if (fd < 0) { +				err = -errno; +				goto out; +			}  			*evsel_fd = fd;  		}  	} +out: +	if (err) +		perf_evsel__close(evsel);  	return err;  } |