Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3406912c authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarJiri 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 73db8f82
Loading
Loading
Loading
Loading
+27 −38
Original line number Diff line number Diff line
@@ -26,8 +26,7 @@ struct perf_inject {
	bool			build_ids;
	bool			sched_stat;
	const char		*input_name;
	int		 pipe_output,
			 output;
	struct perf_data_file	output;
	u64			bytes_written;
	struct list_head	samples;
};
@@ -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)
	size = perf_data_file__write(&inject->output, event,
				     event->header.size);
	if (size < 0)
		return -errno;

		size -= ret;
		buf += ret;
		inject->bytes_written += ret;
	}

	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,17 +452,10 @@ 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) {
	if (perf_data_file__open(&inject.output)) {
		perror("failed to create output file");
		return -1;
	}
	}

	if (symbol__init() < 0)
		return -1;