summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/auxtrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/auxtrace.c')
-rw-r--r--tools/perf/util/auxtrace.c99
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)
OpenPOWER on IntegriCloud