mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	perf inject: Handle output file via perf_data_file object
Using the perf_data_file object to handle output file processing. No functional change intended. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/n/tip-01j9ophd7tntmgrxa40uqjjm@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									73db8f8261
								
							
						
					
					
						commit
						3406912cc1
					
				
					 1 changed files with 27 additions and 38 deletions
				
			
		| 
						 | 
				
			
			@ -22,14 +22,13 @@
 | 
			
		|||
#include <linux/list.h>
 | 
			
		||||
 | 
			
		||||
struct perf_inject {
 | 
			
		||||
	struct perf_tool tool;
 | 
			
		||||
	bool		 build_ids;
 | 
			
		||||
	bool		 sched_stat;
 | 
			
		||||
	const char	 *input_name;
 | 
			
		||||
	int		 pipe_output,
 | 
			
		||||
			 output;
 | 
			
		||||
	u64		 bytes_written;
 | 
			
		||||
	struct list_head samples;
 | 
			
		||||
	struct perf_tool	tool;
 | 
			
		||||
	bool			build_ids;
 | 
			
		||||
	bool			sched_stat;
 | 
			
		||||
	const char		*input_name;
 | 
			
		||||
	struct perf_data_file	output;
 | 
			
		||||
	u64			bytes_written;
 | 
			
		||||
	struct list_head	samples;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct event_entry {
 | 
			
		||||
| 
						 | 
				
			
			@ -42,21 +41,14 @@ static int perf_event__repipe_synth(struct perf_tool *tool,
 | 
			
		|||
				    union perf_event *event)
 | 
			
		||||
{
 | 
			
		||||
	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
 | 
			
		||||
	uint32_t size;
 | 
			
		||||
	void *buf = event;
 | 
			
		||||
	ssize_t size;
 | 
			
		||||
 | 
			
		||||
	size = event->header.size;
 | 
			
		||||
 | 
			
		||||
	while (size) {
 | 
			
		||||
		int ret = write(inject->output, buf, size);
 | 
			
		||||
		if (ret < 0)
 | 
			
		||||
			return -errno;
 | 
			
		||||
 | 
			
		||||
		size -= ret;
 | 
			
		||||
		buf += ret;
 | 
			
		||||
		inject->bytes_written += ret;
 | 
			
		||||
	}
 | 
			
		||||
	size = perf_data_file__write(&inject->output, event,
 | 
			
		||||
				     event->header.size);
 | 
			
		||||
	if (size < 0)
 | 
			
		||||
		return -errno;
 | 
			
		||||
 | 
			
		||||
	inject->bytes_written += size;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +72,7 @@ static int perf_event__repipe_attr(struct perf_tool *tool,
 | 
			
		|||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	if (!inject->pipe_output)
 | 
			
		||||
	if (&inject->output.is_pipe)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return perf_event__repipe_synth(tool, event);
 | 
			
		||||
| 
						 | 
				
			
			@ -355,6 +347,7 @@ static int __cmd_inject(struct perf_inject *inject)
 | 
			
		|||
		.path = inject->input_name,
 | 
			
		||||
		.mode = PERF_DATA_MODE_READ,
 | 
			
		||||
	};
 | 
			
		||||
	struct perf_data_file *file_out = &inject->output;
 | 
			
		||||
 | 
			
		||||
	signal(SIGINT, sig_handler);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -391,14 +384,14 @@ static int __cmd_inject(struct perf_inject *inject)
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!inject->pipe_output)
 | 
			
		||||
		lseek(inject->output, session->header.data_offset, SEEK_SET);
 | 
			
		||||
	if (!file_out->is_pipe)
 | 
			
		||||
		lseek(file_out->fd, session->header.data_offset, SEEK_SET);
 | 
			
		||||
 | 
			
		||||
	ret = perf_session__process_events(session, &inject->tool);
 | 
			
		||||
 | 
			
		||||
	if (!inject->pipe_output) {
 | 
			
		||||
	if (!file_out->is_pipe) {
 | 
			
		||||
		session->header.data_size = inject->bytes_written;
 | 
			
		||||
		perf_session__write_header(session, session->evlist, inject->output, true);
 | 
			
		||||
		perf_session__write_header(session, session->evlist, file_out->fd, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	perf_session__delete(session);
 | 
			
		||||
| 
						 | 
				
			
			@ -427,14 +420,17 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
			
		|||
		},
 | 
			
		||||
		.input_name  = "-",
 | 
			
		||||
		.samples = LIST_HEAD_INIT(inject.samples),
 | 
			
		||||
		.output = {
 | 
			
		||||
			.path = "-",
 | 
			
		||||
			.mode = PERF_DATA_MODE_WRITE,
 | 
			
		||||
		},
 | 
			
		||||
	};
 | 
			
		||||
	const char *output_name = "-";
 | 
			
		||||
	const struct option options[] = {
 | 
			
		||||
		OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
 | 
			
		||||
			    "Inject build-ids into the output stream"),
 | 
			
		||||
		OPT_STRING('i', "input", &inject.input_name, "file",
 | 
			
		||||
			   "input file name"),
 | 
			
		||||
		OPT_STRING('o', "output", &output_name, "file",
 | 
			
		||||
		OPT_STRING('o', "output", &inject.output.path, "file",
 | 
			
		||||
			   "output file name"),
 | 
			
		||||
		OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
 | 
			
		||||
			    "Merge sched-stat and sched-switch for getting events "
 | 
			
		||||
| 
						 | 
				
			
			@ -456,16 +452,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
 | 
			
		|||
	if (argc)
 | 
			
		||||
		usage_with_options(inject_usage, options);
 | 
			
		||||
 | 
			
		||||
	if (!strcmp(output_name, "-")) {
 | 
			
		||||
		inject.pipe_output = 1;
 | 
			
		||||
		inject.output = STDOUT_FILENO;
 | 
			
		||||
	} else {
 | 
			
		||||
		inject.output = open(output_name, O_CREAT | O_WRONLY | O_TRUNC,
 | 
			
		||||
						  S_IRUSR | S_IWUSR);
 | 
			
		||||
		if (inject.output < 0) {
 | 
			
		||||
			perror("failed to create output file");
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	if (perf_data_file__open(&inject.output)) {
 | 
			
		||||
		perror("failed to create output file");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (symbol__init() < 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue