Messages in this thread | | | Date | Wed, 23 Jan 2019 14:04:35 -0700 | From | Mathieu Poirier <> | Subject | Re: [PATCH v6 3/8] perf cs-etm: Set sample flags for trace discontinuity |
| |
On Sat, Jan 19, 2019 at 09:43:42AM +0800, Leo Yan wrote: > In the middle of trace stream, it might be interrupted thus the trace > data is not continuous, the trace stream firstly is ended for previous > trace block and restarted for next block. > > To display related information for showing trace is restarted, this > patch set sample flags for trace discontinuity: > > - If one discontinuity packet is coming, append flag > PERF_IP_FLAG_TRACE_END to the previous packet to indicate the trace > has been ended; > - If one instruction packet is following discontinuity packet, this > instruction packet is the first one packet to restarting trace. So > set flag PERF_IP_FLAG_TRACE_START to discontinuity packet, this flag > will be used to generate sample when connect with the sequential > instruction packet. > > Signed-off-by: Leo Yan <leo.yan@linaro.org> > --- > tools/perf/util/cs-etm.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c > index d05cac5295f1..1aa29633ce77 100644 > --- a/tools/perf/util/cs-etm.c > +++ b/tools/perf/util/cs-etm.c > @@ -1111,6 +1111,7 @@ static int cs_etm__end_block(struct cs_etm_queue *etmq) > static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq) > { > struct cs_etm_packet *packet = etmq->packet; > + struct cs_etm_packet *prev_packet = etmq->prev_packet; > > switch (packet->sample_type) { > case CS_ETM_RANGE: > @@ -1170,8 +1171,26 @@ static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq) > packet->last_instr_subtype == OCSD_S_INSTR_V8_RET) > packet->flags = PERF_IP_FLAG_BRANCH | > PERF_IP_FLAG_RETURN; > + > + /* > + * Decoder might insert a discontinuity in the middle of > + * instruction packets, fixup prev_packet with flag > + * PERF_IP_FLAG_TRACE_BEGIN to indicate restarting trace. > + */ > + if (prev_packet->sample_type == CS_ETM_DISCONTINUITY) > + prev_packet->flags |= PERF_IP_FLAG_BRANCH | > + PERF_IP_FLAG_TRACE_BEGIN; > break; > case CS_ETM_DISCONTINUITY: > + /* > + * The trace is discontinuous, if the previous packet is > + * instruction packet, set flag PERF_IP_FLAG_TRACE_END > + * for previous packet. > + */ > + if (prev_packet->sample_type == CS_ETM_RANGE) > + prev_packet->flags |= PERF_IP_FLAG_BRANCH | > + PERF_IP_FLAG_TRACE_END; > + break; > case CS_ETM_EXCEPTION: > case CS_ETM_EXCEPTION_RET: > case CS_ETM_EMPTY:
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> -- > 2.17.1 >
| |