diff options
Diffstat (limited to 'tools/perf/util/auxtrace.c')
-rw-r--r-- | tools/perf/util/auxtrace.c | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index 6470ea2aa25e..857de69a5361 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c @@ -233,9 +233,9 @@ static void *auxtrace_copy_data(u64 size, struct perf_session *session) return p; } -static int auxtrace_queues__add_buffer(struct auxtrace_queues *queues, - unsigned int idx, - struct auxtrace_buffer *buffer) +static int auxtrace_queues__queue_buffer(struct auxtrace_queues *queues, + unsigned int idx, + struct auxtrace_buffer *buffer) { struct auxtrace_queue *queue; int err; @@ -286,7 +286,7 @@ static int auxtrace_queues__split_buffer(struct auxtrace_queues *queues, return -ENOMEM; b->size = BUFFER_LIMIT_FOR_32_BIT; b->consecutive = consecutive; - err = auxtrace_queues__add_buffer(queues, idx, b); + err = auxtrace_queues__queue_buffer(queues, idx, b); if (err) { auxtrace_buffer__free(b); return err; @@ -302,31 +302,6 @@ static int auxtrace_queues__split_buffer(struct auxtrace_queues *queues, return 0; } -static int auxtrace_queues__add_event_buffer(struct auxtrace_queues *queues, - struct perf_session *session, - unsigned int idx, - struct auxtrace_buffer *buffer) -{ - if (session->one_mmap) { - buffer->data = buffer->data_offset - session->one_mmap_offset + - session->one_mmap_addr; - } else if (perf_data__is_pipe(session->data)) { - buffer->data = auxtrace_copy_data(buffer->size, session); - if (!buffer->data) - return -ENOMEM; - buffer->data_needs_freeing = true; - } else if (BITS_PER_LONG == 32 && - buffer->size > BUFFER_LIMIT_FOR_32_BIT) { - int err; - - err = auxtrace_queues__split_buffer(queues, idx, buffer); - if (err) - return err; - } - - return auxtrace_queues__add_buffer(queues, idx, buffer); -} - static bool filter_cpu(struct perf_session *session, int cpu) { unsigned long *cpu_bitmap = session->itrace_synth_opts->cpu_bitmap; @@ -334,45 +309,71 @@ static bool filter_cpu(struct perf_session *session, int cpu) return cpu_bitmap && cpu != -1 && !test_bit(cpu, cpu_bitmap); } -int auxtrace_queues__add_event(struct auxtrace_queues *queues, - struct perf_session *session, - union perf_event *event, off_t data_offset, - struct auxtrace_buffer **buffer_ptr) +static int auxtrace_queues__add_buffer(struct auxtrace_queues *queues, + struct perf_session *session, + unsigned int idx, + struct auxtrace_buffer *buffer, + struct auxtrace_buffer **buffer_ptr) { - struct auxtrace_buffer *buffer; - unsigned int idx; - int err; + int err = -ENOMEM; - if (filter_cpu(session, event->auxtrace.cpu)) + if (filter_cpu(session, buffer->cpu)) return 0; - buffer = zalloc(sizeof(struct auxtrace_buffer)); + buffer = memdup(buffer, sizeof(*buffer)); if (!buffer) return -ENOMEM; - buffer->pid = -1; - buffer->tid = event->auxtrace.tid; - buffer->cpu = event->auxtrace.cpu; - buffer->data_offset = data_offset; - buffer->offset = event->auxtrace.offset; - buffer->reference = event->auxtrace.reference; - buffer->size = event->auxtrace.size; - idx = event->auxtrace.idx; + if (session->one_mmap) { + buffer->data = buffer->data_offset - session->one_mmap_offset + + session->one_mmap_addr; + } else if (perf_data__is_pipe(session->data)) { + buffer->data = auxtrace_copy_data(buffer->size, session); + if (!buffer->data) + goto out_free; + buffer->data_needs_freeing = true; + } else if (BITS_PER_LONG == 32 && + buffer->size > BUFFER_LIMIT_FOR_32_BIT) { + err = auxtrace_queues__split_buffer(queues, idx, buffer); + if (err) + goto out_free; + } - err = auxtrace_queues__add_event_buffer(queues, session, idx, buffer); + err = auxtrace_queues__queue_buffer(queues, idx, buffer); if (err) - goto out_err; + goto out_free; + /* FIXME: Doesn't work for split buffer */ if (buffer_ptr) *buffer_ptr = buffer; return 0; -out_err: +out_free: auxtrace_buffer__free(buffer); return err; } +int auxtrace_queues__add_event(struct auxtrace_queues *queues, + struct perf_session *session, + union perf_event *event, off_t data_offset, + struct auxtrace_buffer **buffer_ptr) +{ + struct auxtrace_buffer buffer = { + .pid = -1, + .tid = event->auxtrace.tid, + .cpu = event->auxtrace.cpu, + .data_offset = data_offset, + .offset = event->auxtrace.offset, + .reference = event->auxtrace.reference, + .size = event->auxtrace.size, + }; + unsigned int idx = event->auxtrace.idx; + + return auxtrace_queues__add_buffer(queues, session, idx, &buffer, + buffer_ptr); +} + static int auxtrace_queues__add_indexed_event(struct auxtrace_queues *queues, struct perf_session *session, off_t file_offset, size_t sz) |