Received: by 10.223.185.116 with SMTP id b49csp4186691wrg; Tue, 13 Feb 2018 14:25:20 -0800 (PST) X-Google-Smtp-Source: AH8x226Kw2WOGtPsUt7yT+391sn84ren44Q0sYBkxcKRVRuBHF+tytvlQXUhgptGvwVYbZJtQJRf X-Received: by 2002:a17:902:8f87:: with SMTP id z7-v6mr2435514plo.242.1518560720022; Tue, 13 Feb 2018 14:25:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518560719; cv=none; d=google.com; s=arc-20160816; b=YlFKTqe7EEwxaCugdyClUbLFHXGKD9cOL6ol03xIAsNrW05rwjuOouggesveNRzKPj zkkHG74rrfkodv2F8wk4DUShJk6TWHtON0XO3Nq/pfwSlRamos0KDERet4uRI1ilvToE bxvyBwhPp5X9/3T5Cj8KTNvOFJtAeV4tBFFpq34tvPhDjt+p7ABbnup5Ue19o9qlmwSf wPzHS5KHD385WV4bIiB34eg3E/IKonNY0gkKWEgLvLG0HWdQrkSUGabtqWbnJO8R7pC8 Ksi2ny5lZHeNz3dKBdHI8kynd7xMa4hYjUgo0O9zVop/PbV5ek0obcE4YeUBHXRBpTAC PPQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=FLjRkeWPxEqgLKEydtrHRgv+Ug04XgrWIc5POSVuI4E=; b=TkFtj5zkY7XcuZql9y0iA81l+DGdhhA3bG4m3d35O07TKXuA5w6QpgMyOGUz4HuprH TdNY4uqYONC8+zHh1L7NtiNoSz2VRX11D/bN+TzQSIre3fBsN877e1NkZLvGbYNRVALq F6VXreWuuMitWTh3Vv1zx0SNTrpGkHFrqH1MNiIrWsjcz2cpRpphKfAfzxZ3VaaOx7DH CMJocZojkDGw6oVU9jFUvWjffQ1HMUKEgtc6Y4w3OJ6wqyyAegDjNzTTkNSRRHqK3PlM +Vttrj/UxYZk45KTQIIBKgYGp1uKK9hlQDyuPo+Izy3updSpp3vboZND+nmBjpsYwpvP tWpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hAArLekN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b31-v6si7986363plb.24.2018.02.13.14.25.03; Tue, 13 Feb 2018 14:25:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=hAArLekN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966053AbeBMWWi (ORCPT + 99 others); Tue, 13 Feb 2018 17:22:38 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:33019 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965935AbeBMWWh (ORCPT ); Tue, 13 Feb 2018 17:22:37 -0500 Received: by mail-pg0-f68.google.com with SMTP id g12so905470pgs.0 for ; Tue, 13 Feb 2018 14:22:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=FLjRkeWPxEqgLKEydtrHRgv+Ug04XgrWIc5POSVuI4E=; b=hAArLekNRT3iHNzNvNwoOlC3KETvotPh1645T4XdLeWJMpy58dBHRoWCbZzOmUNEoB dF2o/wganXcoOXcE8mq6EdRAMwX1hp2lgveWhPSjNeswm/jc4tVVziLCBby7uQmTRp5v 6DCndkNf8/SD5ELAdHJofaG5mP6wck1YheCKY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=FLjRkeWPxEqgLKEydtrHRgv+Ug04XgrWIc5POSVuI4E=; b=oiwMon/1N7S3JzrcXFuXVRgI5m3E93NUpOjUO6avUyMDel0SZQmUMHkWenhsaUIiak ziWvdhyz7FcZrnqSxhoz77JZbBoZR00Cv6X1NxXgvzR9z9OzLf+QtLgGP68gYu7njo/Q Pc5FxZ0ZeIdLjtjQ/rU+xcofDygilk1KDKK6MgDo8k47SeKloUr1/DpKSn8fLC8+9LEE dA6yk9SuJuu57IpQfwoCr5lHcCyyfL3QBcf7IL6TEQCG29xmPGtOAWiqgttQTnPOXbkV CbawQmdrR1/vHSIcTgdPpWmlradBINIUJfJ2tEA/rBgwSX9hb8O3+LSgwtcbO0KTviTq 85dA== X-Gm-Message-State: APf1xPCB+em7aJ9h/BKZg+HN2BGOqoMdoE+aGuINaZgUkUuwe1EeanOW fF1F0FQLkrX7WI3yKZDgnJSNeg== X-Received: by 10.99.157.193 with SMTP id i184mr2112654pgd.197.1518560556669; Tue, 13 Feb 2018 14:22:36 -0800 (PST) Received: from xps15 (S0106002369de4dac.cg.shawcable.net. [68.147.8.254]) by smtp.gmail.com with ESMTPSA id 14sm38499117pfi.132.2018.02.13.14.22.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 Feb 2018 14:22:35 -0800 (PST) Date: Tue, 13 Feb 2018 15:22:33 -0700 From: Mathieu Poirier To: Robert Walker Cc: acme@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org Subject: Re: [PATCH 2/2] perf inject: Emit instruction records on ETM trace discontinuity Message-ID: <20180213222233.GA23553@xps15> References: <1518011845-24063-1-git-send-email-robert.walker@arm.com> <1518011845-24063-3-git-send-email-robert.walker@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1518011845-24063-3-git-send-email-robert.walker@arm.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Feb 07, 2018 at 01:57:25PM +0000, Robert Walker wrote: > There may be discontinuities in the ETM trace stream due to overflows or > ETM configuration for selective trace. This patch emits an instruction > sample with the pending branch stack when a TRACE ON packet occurs > indicating a discontinuity in the trace data. > > A new packet type CS_ETM_TRACE_ON is added, which is emitted by the low > level decoder when a TRACE ON occurs. The higher level decoder flushes the > branch stack when this packet is emitted. > > Signed-off-by: Robert Walker > --- > tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 9 +++ > tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 1 + > tools/perf/util/cs-etm.c | 84 +++++++++++++++++-------- > 3 files changed, 69 insertions(+), 25 deletions(-) > > diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c > index 8ff69df..640af88 100644 > --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c > +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c > @@ -328,7 +328,14 @@ cs_etm_decoder__buffer_range(struct cs_etm_decoder *decoder, > } > > return ret; > +} > > +static ocsd_datapath_resp_t > +cs_etm_decoder__buffer_trace_on(struct cs_etm_decoder *decoder, > + const uint8_t trace_chan_id) > +{ > + return cs_etm_decoder__buffer_packet(decoder, trace_chan_id, > + CS_ETM_TRACE_ON); > } > > static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( > @@ -347,6 +354,8 @@ static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( > decoder->trace_on = false; > break; > case OCSD_GEN_TRC_ELEM_TRACE_ON: > + resp = cs_etm_decoder__buffer_trace_on(decoder, > + trace_chan_id); > decoder->trace_on = true; > break; > case OCSD_GEN_TRC_ELEM_INSTR_RANGE: > diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h > index a4fdd28..743f5f4 100644 > --- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h > +++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h > @@ -24,6 +24,7 @@ struct cs_etm_buffer { > > enum cs_etm_sample_type { > CS_ETM_RANGE = 1 << 0, > + CS_ETM_TRACE_ON = 1 << 1, > }; > > struct cs_etm_packet { > diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c > index 6777246..a8d07bd 100644 > --- a/tools/perf/util/cs-etm.c > +++ b/tools/perf/util/cs-etm.c > @@ -866,6 +866,8 @@ static int cs_etm__sample(struct cs_etm_queue *etmq) > * PREV_PACKET is a branch. > */ > if (etm->synth_opts.last_branch && > + etmq->prev_packet && > + etmq->prev_packet->sample_type == CS_ETM_RANGE && > etmq->prev_packet->last_instr_taken_branch) > cs_etm__update_last_branch_rb(etmq); > > @@ -918,6 +920,40 @@ static int cs_etm__sample(struct cs_etm_queue *etmq) > return 0; > } > > +static int cs_etm__flush(struct cs_etm_queue *etmq) > +{ > + int err = 0; > + struct cs_etm_packet *tmp; > + > + if (etmq->etm->synth_opts.last_branch && > + etmq->prev_packet && > + etmq->prev_packet->sample_type == CS_ETM_RANGE) { > + /* > + * Generate a last branch event for the branches left in the > + * circular buffer at the end of the trace. > + * > + * Use the address of the end of the last reported execution > + * range > + */ > + u64 addr = cs_etm__last_executed_instr(etmq->prev_packet); > + > + err = cs_etm__synth_instruction_sample( > + etmq, addr, > + etmq->period_instructions); > + etmq->period_instructions = 0; > + > + /* > + * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for > + * the next incoming packet. > + */ > + tmp = etmq->packet; > + etmq->packet = etmq->prev_packet; > + etmq->prev_packet = tmp; > + } > + > + return err; > +} > + > static int cs_etm__run_decoder(struct cs_etm_queue *etmq) > { > struct cs_etm_auxtrace *etm = etmq->etm; > @@ -946,20 +982,19 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) > /* Run trace decoder until buffer consumed or end of trace */ > do { > processed = 0; > - this... > err = cs_etm_decoder__process_data_block( > etmq->decoder, > etmq->offset, > &buffer.buf[buffer_used], > buffer.len - buffer_used, > &processed); > - and this should have gone in the first patch. > if (err) > return err; > > etmq->offset += processed; > buffer_used += processed; > > + /* Process each packet in this chunk */ And probably this too. With the above changes: Acked-by: Mathieu Poirier > while (1) { > err = cs_etm_decoder__get_packet(etmq->decoder, > etmq->packet); > @@ -970,32 +1005,31 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) > */ > break; > > - /* > - * If the packet contains an instruction > - * range, generate instruction sequence > - * events. > - */ > - if (etmq->packet->sample_type & CS_ETM_RANGE) > - err = cs_etm__sample(etmq); > + switch (etmq->packet->sample_type) { > + case CS_ETM_RANGE: > + /* > + * If the packet contains an instruction > + * range, generate instruction sequence > + * events. > + */ > + cs_etm__sample(etmq); > + break; > + case CS_ETM_TRACE_ON: > + /* > + * Discontinuity in trace, flush > + * previous branch stack > + */ > + cs_etm__flush(etmq); > + break; > + default: > + break; > + } > } > } while (buffer.len > buffer_used); > > - /* > - * Generate a last branch event for the branches left in > - * the circular buffer at the end of the trace. > - */ > - if (etm->sample_instructions && > - etmq->etm->synth_opts.last_branch) { > - struct branch_stack *bs = etmq->last_branch_rb; > - struct branch_entry *be = > - &bs->entries[etmq->last_branch_pos]; > - > - err = cs_etm__synth_instruction_sample( > - etmq, be->to, etmq->period_instructions); > - if (err) > - return err; > - } > - > + if (err == 0) > + /* Flush any remaining branch stack entries */ > + err = cs_etm__flush(etmq); > } > > return err; > -- > 2.7.4 >