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:
Jiri Olsa 2013-10-29 19:04:57 +01:00 committed by Arnaldo Carvalho de Melo
parent 73db8f8261
commit 3406912cc1
1 changed files with 27 additions and 38 deletions

View File

@ -22,14 +22,13 @@
#include <linux/list.h> #include <linux/list.h>
struct perf_inject { struct perf_inject {
struct perf_tool tool; struct perf_tool tool;
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;
}; };
struct event_entry { struct event_entry {
@ -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); return -errno;
if (ret < 0)
return -errno;
size -= ret;
buf += ret;
inject->bytes_written += ret;
}
inject->bytes_written += size;
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,16 +452,9 @@ 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; perror("failed to create output file");
inject.output = STDOUT_FILENO; return -1;
} 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 (symbol__init() < 0) if (symbol__init() < 0)