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
				
			
		|  | @ -26,8 +26,7 @@ struct perf_inject { | ||||||
| 	bool			build_ids; | 	bool			build_ids; | ||||||
| 	bool			sched_stat; | 	bool			sched_stat; | ||||||
| 	const char		*input_name; | 	const char		*input_name; | ||||||
| 	int		 pipe_output, | 	struct perf_data_file	output; | ||||||
| 			 output; |  | ||||||
| 	u64			bytes_written; | 	u64			bytes_written; | ||||||
| 	struct list_head	samples; | 	struct list_head	samples; | ||||||
| }; | }; | ||||||
|  | @ -42,21 +41,14 @@ static int perf_event__repipe_synth(struct perf_tool *tool, | ||||||
| 				    union perf_event *event) | 				    union perf_event *event) | ||||||
| { | { | ||||||
| 	struct perf_inject *inject = container_of(tool, struct perf_inject, tool); | 	struct perf_inject *inject = container_of(tool, struct perf_inject, tool); | ||||||
| 	uint32_t size; | 	ssize_t size; | ||||||
| 	void *buf = event; |  | ||||||
| 
 | 
 | ||||||
| 	size = event->header.size; | 	size = perf_data_file__write(&inject->output, event, | ||||||
| 
 | 				     event->header.size); | ||||||
| 	while (size) { | 	if (size < 0) | ||||||
| 		int ret = write(inject->output, buf, size); |  | ||||||
| 		if (ret < 0) |  | ||||||
| 		return -errno; | 		return -errno; | ||||||
| 
 | 
 | ||||||
| 		size -= ret; | 	inject->bytes_written += size; | ||||||
| 		buf += ret; |  | ||||||
| 		inject->bytes_written += ret; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +72,7 @@ static int perf_event__repipe_attr(struct perf_tool *tool, | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	if (!inject->pipe_output) | 	if (&inject->output.is_pipe) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	return perf_event__repipe_synth(tool, event); | 	return perf_event__repipe_synth(tool, event); | ||||||
|  | @ -355,6 +347,7 @@ static int __cmd_inject(struct perf_inject *inject) | ||||||
| 		.path = inject->input_name, | 		.path = inject->input_name, | ||||||
| 		.mode = PERF_DATA_MODE_READ, | 		.mode = PERF_DATA_MODE_READ, | ||||||
| 	}; | 	}; | ||||||
|  | 	struct perf_data_file *file_out = &inject->output; | ||||||
| 
 | 
 | ||||||
| 	signal(SIGINT, sig_handler); | 	signal(SIGINT, sig_handler); | ||||||
| 
 | 
 | ||||||
|  | @ -391,14 +384,14 @@ static int __cmd_inject(struct perf_inject *inject) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!inject->pipe_output) | 	if (!file_out->is_pipe) | ||||||
| 		lseek(inject->output, session->header.data_offset, SEEK_SET); | 		lseek(file_out->fd, session->header.data_offset, SEEK_SET); | ||||||
| 
 | 
 | ||||||
| 	ret = perf_session__process_events(session, &inject->tool); | 	ret = perf_session__process_events(session, &inject->tool); | ||||||
| 
 | 
 | ||||||
| 	if (!inject->pipe_output) { | 	if (!file_out->is_pipe) { | ||||||
| 		session->header.data_size = inject->bytes_written; | 		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); | 	perf_session__delete(session); | ||||||
|  | @ -427,14 +420,17 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | ||||||
| 		}, | 		}, | ||||||
| 		.input_name  = "-", | 		.input_name  = "-", | ||||||
| 		.samples = LIST_HEAD_INIT(inject.samples), | 		.samples = LIST_HEAD_INIT(inject.samples), | ||||||
|  | 		.output = { | ||||||
|  | 			.path = "-", | ||||||
|  | 			.mode = PERF_DATA_MODE_WRITE, | ||||||
|  | 		}, | ||||||
| 	}; | 	}; | ||||||
| 	const char *output_name = "-"; |  | ||||||
| 	const struct option options[] = { | 	const struct option options[] = { | ||||||
| 		OPT_BOOLEAN('b', "build-ids", &inject.build_ids, | 		OPT_BOOLEAN('b', "build-ids", &inject.build_ids, | ||||||
| 			    "Inject build-ids into the output stream"), | 			    "Inject build-ids into the output stream"), | ||||||
| 		OPT_STRING('i', "input", &inject.input_name, "file", | 		OPT_STRING('i', "input", &inject.input_name, "file", | ||||||
| 			   "input file name"), | 			   "input file name"), | ||||||
| 		OPT_STRING('o', "output", &output_name, "file", | 		OPT_STRING('o', "output", &inject.output.path, "file", | ||||||
| 			   "output file name"), | 			   "output file name"), | ||||||
| 		OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat, | 		OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat, | ||||||
| 			    "Merge sched-stat and sched-switch for getting events " | 			    "Merge sched-stat and sched-switch for getting events " | ||||||
|  | @ -456,17 +452,10 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) | ||||||
| 	if (argc) | 	if (argc) | ||||||
| 		usage_with_options(inject_usage, options); | 		usage_with_options(inject_usage, options); | ||||||
| 
 | 
 | ||||||
| 	if (!strcmp(output_name, "-")) { | 	if (perf_data_file__open(&inject.output)) { | ||||||
| 		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"); | 		perror("failed to create output file"); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	if (symbol__init() < 0) | 	if (symbol__init() < 0) | ||||||
| 		return -1; | 		return -1; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jiri Olsa
				Jiri Olsa