diff options
Diffstat (limited to 'tools/perf/util/record.c')
| -rw-r--r-- | tools/perf/util/record.c | 27 | 
1 files changed, 23 insertions, 4 deletions
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c index 049e0a09ccd3..fe8079edbdc1 100644 --- a/tools/perf/util/record.c +++ b/tools/perf/util/record.c @@ -4,6 +4,7 @@  #include "parse-events.h"  #include <api/fs/fs.h>  #include "util.h" +#include "cloexec.h"  typedef void (*setup_probe_fn_t)(struct perf_evsel *evsel); @@ -11,6 +12,7 @@ static int perf_do_probe_api(setup_probe_fn_t fn, int cpu, const char *str)  {  	struct perf_evlist *evlist;  	struct perf_evsel *evsel; +	unsigned long flags = perf_event_open_cloexec_flag();  	int err = -EAGAIN, fd;  	evlist = perf_evlist__new(); @@ -22,14 +24,14 @@ static int perf_do_probe_api(setup_probe_fn_t fn, int cpu, const char *str)  	evsel = perf_evlist__first(evlist); -	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0); +	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, flags);  	if (fd < 0)  		goto out_delete;  	close(fd);  	fn(evsel); -	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0); +	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, flags);  	if (fd < 0) {  		if (errno == EINVAL)  			err = -EINVAL; @@ -69,15 +71,26 @@ static void perf_probe_sample_identifier(struct perf_evsel *evsel)  	evsel->attr.sample_type |= PERF_SAMPLE_IDENTIFIER;  } +static void perf_probe_comm_exec(struct perf_evsel *evsel) +{ +	evsel->attr.comm_exec = 1; +} +  bool perf_can_sample_identifier(void)  {  	return perf_probe_api(perf_probe_sample_identifier);  } +static bool perf_can_comm_exec(void) +{ +	return perf_probe_api(perf_probe_comm_exec); +} +  void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)  {  	struct perf_evsel *evsel;  	bool use_sample_identifier = false; +	bool use_comm_exec;  	/*  	 * Set the evsel leader links before we configure attributes, @@ -89,8 +102,13 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)  	if (evlist->cpus->map[0] < 0)  		opts->no_inherit = true; -	evlist__for_each(evlist, evsel) +	use_comm_exec = perf_can_comm_exec(); + +	evlist__for_each(evlist, evsel) {  		perf_evsel__config(evsel, opts); +		if (!evsel->idx && use_comm_exec) +			evsel->attr.comm_exec = 1; +	}  	if (evlist->nr_entries > 1) {  		struct perf_evsel *first = perf_evlist__first(evlist); @@ -203,7 +221,8 @@ bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str)  		cpu = evlist->cpus->map[0];  	} -	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0); +	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, +				 perf_event_open_cloexec_flag());  	if (fd >= 0) {  		close(fd);  		ret = true;  |