Skip to content

Commit

Permalink
perf auxtrace: Make auxtrace_queues__add_buffer() allocate struct buffer
Browse files Browse the repository at this point in the history
In preparation for supporting AUX area sampling buffers,
auxtrace_queues__add_buffer() needs to be more generic. To that end,
move memory allocation for struct buffer into it.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1520327598-1317-7-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Adrian Hunter authored and Arnaldo Carvalho de Melo committed Apr 5, 2018
1 parent d1e7e60 commit 0d75f12
Showing 1 changed file with 24 additions and 30 deletions.
54 changes: 24 additions & 30 deletions tools/perf/util/auxtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,32 +308,40 @@ static int auxtrace_queues__add_buffer(struct auxtrace_queues *queues,
struct auxtrace_buffer *buffer,
struct auxtrace_buffer **buffer_ptr)
{
int err;
int err = -ENOMEM;

buffer = memdup(buffer, sizeof(*buffer));
if (!buffer)
return -ENOMEM;

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;
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)
return err;
goto out_free;
}

err = auxtrace_queues__queue_buffer(queues, idx, buffer);
if (err)
return err;
goto out_free;

/* FIXME: Doesn't work for split buffer */
if (buffer_ptr)
*buffer_ptr = buffer;

return 0;

out_free:
auxtrace_buffer__free(buffer);
return err;
}

static bool filter_cpu(struct perf_session *session, int cpu)
Expand All @@ -348,36 +356,22 @@ int auxtrace_queues__add_event(struct auxtrace_queues *queues,
union perf_event *event, off_t data_offset,
struct auxtrace_buffer **buffer_ptr)
{
struct auxtrace_buffer *buffer;
unsigned int idx;
int err;
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;

if (filter_cpu(session, event->auxtrace.cpu))
return 0;

buffer = zalloc(sizeof(struct auxtrace_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;

err = auxtrace_queues__add_buffer(queues, session, idx, buffer,
buffer_ptr);
if (err)
goto out_err;

return 0;

out_err:
auxtrace_buffer__free(buffer);
return err;
return auxtrace_queues__add_buffer(queues, session, idx, &buffer,
buffer_ptr);
}

static int auxtrace_queues__add_indexed_event(struct auxtrace_queues *queues,
Expand Down

0 comments on commit 0d75f12

Please sign in to comment.