forked from Minki/linux
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
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user