Commit 23cfcd6d authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Arnaldo Carvalho de Melo

perf cs-etm: Make cs_etm__run_decoder() queue independent

This patch makes decoding of auxtrace buffer centered around a struct
cs_etm_queue.  This eliminates surperflous variables and is a precursor
for work that simplifies the main decoder loop.
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki K Poulouse <suzuki.poulose@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/20190212171618.25355-11-mathieu.poirier@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 4b6df11a
...@@ -15,13 +15,6 @@ ...@@ -15,13 +15,6 @@
struct cs_etm_decoder; struct cs_etm_decoder;
struct cs_etm_buffer {
const unsigned char *buf;
size_t len;
u64 offset;
u64 ref_timestamp;
};
enum cs_etm_sample_type { enum cs_etm_sample_type {
CS_ETM_EMPTY, CS_ETM_EMPTY,
CS_ETM_RANGE, CS_ETM_RANGE,
......
...@@ -76,6 +76,8 @@ struct cs_etm_queue { ...@@ -76,6 +76,8 @@ struct cs_etm_queue {
size_t last_branch_pos; size_t last_branch_pos;
struct cs_etm_packet *prev_packet; struct cs_etm_packet *prev_packet;
struct cs_etm_packet *packet; struct cs_etm_packet *packet;
const unsigned char *buf;
size_t buf_len, buf_used;
}; };
static int cs_etm__update_queues(struct cs_etm_auxtrace *etm); static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
...@@ -683,7 +685,7 @@ static int cs_etm__inject_event(union perf_event *event, ...@@ -683,7 +685,7 @@ static int cs_etm__inject_event(union perf_event *event,
static int static int
cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq) cs_etm__get_trace(struct cs_etm_queue *etmq)
{ {
struct auxtrace_buffer *aux_buffer = etmq->buffer; struct auxtrace_buffer *aux_buffer = etmq->buffer;
struct auxtrace_buffer *old_buffer = aux_buffer; struct auxtrace_buffer *old_buffer = aux_buffer;
...@@ -697,7 +699,7 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq) ...@@ -697,7 +699,7 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
if (!aux_buffer) { if (!aux_buffer) {
if (old_buffer) if (old_buffer)
auxtrace_buffer__drop_data(old_buffer); auxtrace_buffer__drop_data(old_buffer);
buff->len = 0; etmq->buf_len = 0;
return 0; return 0;
} }
...@@ -717,13 +719,11 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq) ...@@ -717,13 +719,11 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
if (old_buffer) if (old_buffer)
auxtrace_buffer__drop_data(old_buffer); auxtrace_buffer__drop_data(old_buffer);
buff->offset = aux_buffer->offset; etmq->buf_used = 0;
buff->len = aux_buffer->size; etmq->buf_len = aux_buffer->size;
buff->buf = aux_buffer->data; etmq->buf = aux_buffer->data;
buff->ref_timestamp = aux_buffer->reference; return etmq->buf_len;
return buff->len;
} }
static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
...@@ -1493,24 +1493,23 @@ static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq) ...@@ -1493,24 +1493,23 @@ static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq)
static int cs_etm__run_decoder(struct cs_etm_queue *etmq) static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
{ {
struct cs_etm_buffer buffer; size_t processed;
size_t buffer_used, processed;
int err = 0; int err = 0;
/* Go through each buffer in the queue and decode them one by one */ /* Go through each buffer in the queue and decode them one by one */
while (1) { while (1) {
buffer_used = 0; if (!etmq->buf_len) {
memset(&buffer, 0, sizeof(buffer)); err = cs_etm__get_trace(etmq);
err = cs_etm__get_trace(&buffer, etmq);
if (err <= 0) if (err <= 0)
return err; return err;
/* /*
* We cannot assume consecutive blocks in the data file are * We cannot assume consecutive blocks in the data file
* contiguous, reset the decoder to force re-sync. * are contiguous, reset the decoder to force re-sync.
*/ */
err = cs_etm_decoder__reset(etmq->decoder); err = cs_etm_decoder__reset(etmq->decoder);
if (err != 0) if (err != 0)
return err; return err;
}
/* Run trace decoder until buffer consumed or end of trace */ /* Run trace decoder until buffer consumed or end of trace */
do { do {
...@@ -1518,14 +1517,15 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) ...@@ -1518,14 +1517,15 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
err = cs_etm_decoder__process_data_block( err = cs_etm_decoder__process_data_block(
etmq->decoder, etmq->decoder,
etmq->offset, etmq->offset,
&buffer.buf[buffer_used], &etmq->buf[etmq->buf_used],
buffer.len - buffer_used, etmq->buf_len,
&processed); &processed);
if (err) if (err)
return err; return err;
etmq->offset += processed; etmq->offset += processed;
buffer_used += processed; etmq->buf_used += processed;
etmq->buf_len -= processed;
/* Process each packet in this chunk */ /* Process each packet in this chunk */
while (1) { while (1) {
...@@ -1585,7 +1585,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) ...@@ -1585,7 +1585,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
break; break;
} }
} }
} while (buffer.len > buffer_used); } while (etmq->buf_len);
if (err == 0) if (err == 0)
/* Flush any remaining branch stack entries */ /* Flush any remaining branch stack entries */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment