Re: [RFC PATCH v3] perf cs-etm: Split Coresight decode by aux records
From: Mathieu Poirier <mathieu.poirier@linaro.org>
Date: 2021-05-27 15:38:12
Also in:
linux-perf-users, lkml
On Thu, 27 May 2021 at 07:46, James Clark [off-list ref] wrote:
On 27/05/2021 13:42, James Clark wrote:quoted
Populate the auxtrace queues using AUX records rather than whole auxtrace buffers....quoted
Snapshot mode still needs to be tested.Snapshot mode is also working, but needs the following patch applied to reverse aux_offset from the end of the buffer to the beginning:
It might be better to send another revision with this patch included in to make sure everyone is looking at (and testing) the same thing.
quoted hunk ↗ jump to hunk
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 5d6c03488187..9db556e14dfa 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c@@ -2700,6 +2700,7 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, struct perf_record_auxtrace *auxtrace_event; union perf_event auxtrace_fragment; bool matchesCpuPid; + __u64 aux_offset; struct cs_etm_auxtrace *etm = container_of(session->auxtrace, struct cs_etm_auxtrace, auxtrace);@@ -2730,19 +2731,26 @@ static int cs_etm__queue_aux_fragment(struct perf_session *session, else matchesCpuPid = auxtrace_event->cpu == sample->cpu; + /* + * In snapshot/overwrite mode, the head points to the end of the buffer so aux_offset needs + * to have the size subtracted so it points to the beginning as in normal mode. + */ + if (aux_event->flags && PERF_AUX_FLAG_OVERWRITE) + aux_offset = aux_event->aux_offset - aux_event->aux_size; + else + aux_offset = aux_event->aux_offset; + if (matchesCpuPid && - aux_event->aux_offset >= auxtrace_event->offset && - aux_event->aux_offset + aux_event->aux_size <= - auxtrace_event->offset + auxtrace_event->size) { + aux_offset >= auxtrace_event->offset && + aux_offset + aux_event->aux_size <= auxtrace_event->offset + auxtrace_event->size) { /* * If this AUX event was inside this buffer somewhere, create a new auxtrace event * based on the sizes of the aux event, and queue that fragment. */ auxtrace_fragment.auxtrace = *auxtrace_event; auxtrace_fragment.auxtrace.size = aux_event->aux_size; - auxtrace_fragment.auxtrace.offset = aux_event->aux_offset; - file_offset += aux_event->aux_offset - auxtrace_event->offset + - auxtrace_event->header.size; + auxtrace_fragment.auxtrace.offset = aux_offset; + file_offset += aux_offset - auxtrace_event->offset + auxtrace_event->header.size; return auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel