diff options
Diffstat (limited to 'tools/perf/builtin-record.c')
| -rw-r--r-- | tools/perf/builtin-record.c | 44 | 
1 files changed, 37 insertions, 7 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 9a71f0330137..cf5c5379ceaa 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1388,6 +1388,11 @@ static struct perf_event_header finished_round_event = {  	.type = PERF_RECORD_FINISHED_ROUND,  }; +static struct perf_event_header finished_init_event = { +	.size = sizeof(struct perf_event_header), +	.type = PERF_RECORD_FINISHED_INIT, +}; +  static void record__adjust_affinity(struct record *rec, struct mmap *map)  {  	if (rec->opts.affinity != PERF_AFFINITY_SYS && @@ -1696,6 +1701,14 @@ static int record__synthesize_workload(struct record *rec, bool tail)  	return err;  } +static int write_finished_init(struct record *rec, bool tail) +{ +	if (rec->opts.tail_synthesize != tail) +		return 0; + +	return record__write(rec, NULL, &finished_init_event, sizeof(finished_init_event)); +} +  static int record__synthesize(struct record *rec, bool tail);  static int @@ -1710,6 +1723,8 @@ record__switch_output(struct record *rec, bool at_exit)  	record__aio_mmap_read_sync(rec); +	write_finished_init(rec, true); +  	record__synthesize(rec, true);  	if (target__none(&rec->opts.target))  		record__synthesize_workload(rec, true); @@ -1764,6 +1779,7 @@ record__switch_output(struct record *rec, bool at_exit)  		 */  		if (target__none(&rec->opts.target))  			record__synthesize_workload(rec, false); +		write_finished_init(rec, false);  	}  	return fd;  } @@ -1834,13 +1850,11 @@ static int record__synthesize(struct record *rec, bool tail)  		goto out;  	/* Synthesize id_index before auxtrace_info */ -	if (rec->opts.auxtrace_sample_mode || rec->opts.full_auxtrace) { -		err = perf_event__synthesize_id_index(tool, -						      process_synthesized_event, -						      session->evlist, machine); -		if (err) -			goto out; -	} +	err = perf_event__synthesize_id_index(tool, +					      process_synthesized_event, +					      session->evlist, machine); +	if (err) +		goto out;  	if (rec->opts.full_auxtrace) {  		err = perf_event__synthesize_auxtrace_info(rec->itr, tool, @@ -2421,6 +2435,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)  	trigger_ready(&auxtrace_snapshot_trigger);  	trigger_ready(&switch_output_trigger);  	perf_hooks__invoke_record_start(); + +	/* +	 * Must write FINISHED_INIT so it will be seen after all other +	 * synthesized user events, but before any regular events. +	 */ +	err = write_finished_init(rec, false); +	if (err < 0) +		goto out_child; +  	for (;;) {  		unsigned long long hits = thread->samples; @@ -2565,6 +2588,8 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)  		fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n",  			record__waking(rec)); +	write_finished_init(rec, true); +  	if (target__none(&rec->opts.target))  		record__synthesize_workload(rec, true); @@ -3193,6 +3218,8 @@ static struct option __record_options[] = {  	OPT_BOOLEAN(0, "code-page-size", &record.opts.sample_code_page_size,  		    "Record the sampled code address (ip) page size"),  	OPT_BOOLEAN(0, "sample-cpu", &record.opts.sample_cpu, "Record the sample cpu"), +	OPT_BOOLEAN(0, "sample-identifier", &record.opts.sample_identifier, +		    "Record the sample identifier"),  	OPT_BOOLEAN_SET('T', "timestamp", &record.opts.sample_time,  			&record.opts.sample_time_set,  			"Record the sample timestamps"), @@ -3805,6 +3832,9 @@ int cmd_record(int argc, const char **argv)  		goto out_opts;  	} +	if (rec->opts.kcore) +		rec->opts.text_poke = true; +  	if (rec->opts.kcore || record__threads_enabled(rec))  		rec->data.is_dir = true;  |