mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	perf record: Add '--timestamp-filename' option to append timestamp to output file name
This option appends current timestamp to the output file name. For example: # perf record -a --timestamp-filename ^C[ perf record: Woken up 1 times to write data ] [ perf record: Dump perf.data.2015122622265847 ] [ perf record: Captured and wrote 0.742 MB perf.data.<timestamp> (90 samples) ] # ls perf.data.201512262226584 The timestamp will be useful for identifying each perf.data after the 'perf record' support for generating multiple output files gets introduced. Signed-off-by: Wang Nan <wangnan0@huawei.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1460535673-159866-5-git-send-email-wangnan0@huawei.com Signed-off-by: He Kuang <hekuang@huawei.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									c0bdc1c461
								
							
						
					
					
						commit
						ecfd7a9c04
					
				
					 1 changed files with 49 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -56,6 +56,7 @@ struct record {
 | 
			
		|||
	bool			no_buildid_cache;
 | 
			
		||||
	bool			no_buildid_cache_set;
 | 
			
		||||
	bool			buildid_all;
 | 
			
		||||
	bool			timestamp_filename;
 | 
			
		||||
	unsigned long long	samples;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -531,6 +532,37 @@ record__finish_output(struct record *rec)
 | 
			
		|||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
record__switch_output(struct record *rec, bool at_exit)
 | 
			
		||||
{
 | 
			
		||||
	struct perf_data_file *file = &rec->file;
 | 
			
		||||
	int fd, err;
 | 
			
		||||
 | 
			
		||||
	/* Same Size:      "2015122520103046"*/
 | 
			
		||||
	char timestamp[] = "InvalidTimestamp";
 | 
			
		||||
 | 
			
		||||
	rec->samples = 0;
 | 
			
		||||
	record__finish_output(rec);
 | 
			
		||||
	err = fetch_current_timestamp(timestamp, sizeof(timestamp));
 | 
			
		||||
	if (err) {
 | 
			
		||||
		pr_err("Failed to get current timestamp\n");
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fd = perf_data_file__switch(file, timestamp,
 | 
			
		||||
				    rec->session->header.data_offset,
 | 
			
		||||
				    at_exit);
 | 
			
		||||
	if (fd >= 0 && !at_exit) {
 | 
			
		||||
		rec->bytes_written = 0;
 | 
			
		||||
		rec->session->header.data_size = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!quiet)
 | 
			
		||||
		fprintf(stderr, "[ perf record: Dump %s.%s ]\n",
 | 
			
		||||
			file->path, timestamp);
 | 
			
		||||
	return fd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static volatile int workload_exec_errno;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -865,11 +897,22 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
 | 
			
		|||
	/* this will be recalculated during process_buildids() */
 | 
			
		||||
	rec->samples = 0;
 | 
			
		||||
 | 
			
		||||
	if (!err)
 | 
			
		||||
		record__finish_output(rec);
 | 
			
		||||
	if (!err) {
 | 
			
		||||
		if (!rec->timestamp_filename) {
 | 
			
		||||
			record__finish_output(rec);
 | 
			
		||||
		} else {
 | 
			
		||||
			fd = record__switch_output(rec, true);
 | 
			
		||||
			if (fd < 0) {
 | 
			
		||||
				status = fd;
 | 
			
		||||
				goto out_delete_session;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!err && !quiet) {
 | 
			
		||||
		char samples[128];
 | 
			
		||||
		const char *postfix = rec->timestamp_filename ?
 | 
			
		||||
					".<timestamp>" : "";
 | 
			
		||||
 | 
			
		||||
		if (rec->samples && !rec->opts.full_auxtrace)
 | 
			
		||||
			scnprintf(samples, sizeof(samples),
 | 
			
		||||
| 
						 | 
				
			
			@ -877,9 +920,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
 | 
			
		|||
		else
 | 
			
		||||
			samples[0] = '\0';
 | 
			
		||||
 | 
			
		||||
		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s ]\n",
 | 
			
		||||
		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
 | 
			
		||||
			perf_data_file__size(file) / 1024.0 / 1024.0,
 | 
			
		||||
			file->path, samples);
 | 
			
		||||
			file->path, postfix, samples);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
out_delete_session:
 | 
			
		||||
| 
						 | 
				
			
			@ -1249,6 +1292,8 @@ struct option __record_options[] = {
 | 
			
		|||
		   "file", "vmlinux pathname"),
 | 
			
		||||
	OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
 | 
			
		||||
		    "Record build-id of all DSOs regardless of hits"),
 | 
			
		||||
	OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
 | 
			
		||||
		    "append timestamp to output filename"),
 | 
			
		||||
	OPT_END()
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue