| From | Alexander Shishkin <> | Subject | [PATCH v0 60/71] perf inject: Re-pipe Instruction Tracing events | Date | Wed, 11 Dec 2013 14:37:12 +0200 |
| |
From: Adrian Hunter <adrian.hunter@intel.com>
New Instruction Tracing events must be re-piped by default.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- tools/perf/builtin-inject.c | 68 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-)
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 78911a3..8c47982 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -38,20 +38,14 @@ struct event_entry { union perf_event event[0]; }; -static int perf_event__repipe_synth(struct perf_tool *tool, - union perf_event *event) +static int output_bytes(struct perf_inject *inject, void *buf, size_t size) { - struct perf_inject *inject = container_of(tool, struct perf_inject, tool); - uint32_t size; - void *buf = event; - - size = event->header.size; + ssize_t ret; while (size) { - int ret = write(inject->output, buf, size); + ret = write(inject->output, buf, size); if (ret < 0) return -errno; - size -= ret; buf += ret; inject->bytes_written += ret; @@ -60,6 +54,34 @@ static int perf_event__repipe_synth(struct perf_tool *tool, return 0; } +static int copy_bytes(struct perf_inject *inject, int fd, size_t size) +{ + char buf[4096]; + ssize_t ssz; + int ret; + + while (size) { + ssz = read(fd, buf, min(size, sizeof(buf))); + if (ssz < 0) + return -errno; + ret = output_bytes(inject, buf, ssz); + if (ret) + return ret; + size -= ssz; + } + + return 0; +} + +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); + + return output_bytes(inject, event, event->header.size); +} + static int perf_event__repipe_op2_synth(struct perf_tool *tool, union perf_event *event, struct perf_session *session @@ -86,6 +108,31 @@ static int perf_event__repipe_attr(struct perf_tool *tool, return perf_event__repipe_synth(tool, event); } +static s64 perf_event__repipe_itrace(struct perf_tool *tool, + union perf_event *event, + struct perf_session *session + __maybe_unused) +{ + struct perf_inject *inject = container_of(tool, struct perf_inject, + tool); + int ret; + + if (perf_data_file__is_pipe(session->file) || !session->one_mmap) { + ret = output_bytes(inject, event, event->header.size); + if (ret < 0) + return ret; + ret = copy_bytes(inject, perf_data_file__fd(session->file), + event->itrace.size); + } else { + ret = output_bytes(inject, event, + event->header.size + event->itrace.size); + } + if (ret < 0) + return ret; + + return event->itrace.size; +} + static int perf_event__repipe(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample __maybe_unused, @@ -423,6 +470,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) .unthrottle = perf_event__repipe, .attr = perf_event__repipe_attr, .tracing_data = perf_event__repipe_op2_synth, + .itrace_info = perf_event__repipe_op2_synth, + .itrace = perf_event__repipe_itrace, + .itrace_error = perf_event__repipe_op2_synth, .finished_round = perf_event__repipe_op2_synth, .build_id = perf_event__repipe_op2_synth, .id_index = perf_event__repipe_op2_synth, -- 1.8.5.1
|