diff options
Diffstat (limited to 'tools/perf/builtin-record.c')
| -rw-r--r-- | tools/perf/builtin-record.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index f82480fa7f2..6ab58cc99d5 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -262,13 +262,16 @@ static bool perf_evlist__equal(struct perf_evlist *evlist,  static void open_counters(struct perf_evlist *evlist)  { -	struct perf_evsel *pos; +	struct perf_evsel *pos, *first;  	if (evlist->cpus->map[0] < 0)  		no_inherit = true; +	first = list_entry(evlist->entries.next, struct perf_evsel, node); +  	list_for_each_entry(pos, &evlist->entries, node) {  		struct perf_event_attr *attr = &pos->attr; +		struct xyarray *group_fd = NULL;  		/*  		 * Check if parse_single_tracepoint_event has already asked for  		 * PERF_SAMPLE_TIME. @@ -283,15 +286,19 @@ static void open_counters(struct perf_evlist *evlist)  		 */  		bool time_needed = attr->sample_type & PERF_SAMPLE_TIME; +		if (group && pos != first) +			group_fd = first->fd; +  		config_attr(pos, evlist);  retry_sample_id:  		attr->sample_id_all = sample_id_all_avail ? 1 : 0;  try_again: -		if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group) < 0) { +		if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group, +				     group_fd) < 0) {  			int err = errno;  			if (err == EPERM || err == EACCES) { -				ui__warning_paranoid(); +				ui__error_paranoid();  				exit(EXIT_FAILURE);  			} else if (err ==  ENODEV && cpu_list) {  				die("No such device - did you specify"  |