Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3416902imu; Mon, 10 Dec 2018 01:39:37 -0800 (PST) X-Google-Smtp-Source: AFSGD/WhYBFMSyLMvlpRzweXs6b6GStdG4YMlrb8odo2tQfqnRd+tkYq6nHUsv3t3aw1zQlI4KMN X-Received: by 2002:a62:2044:: with SMTP id g65mr11615968pfg.127.1544434777615; Mon, 10 Dec 2018 01:39:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544434777; cv=none; d=google.com; s=arc-20160816; b=tD3BkwigJQiGmi0d6VZIo4I9LB1hekOZwcm+ZN0ehldwgPl5QdB8oLSzthZp83sU2h goD3dHkjMotEo1Xvgyk0zndytGCppw7ZXbGeOfrLU6Xe74t4nF3e5Rv+zA1rjLYpcs7X A8wEIJZu6xKrxbnQvaF6Ie8NXh4VdEYIn2EBSedjSfcnutWiMaBZg2t5gNrwYsLdsuw9 6pm1Ehn6mLyrYWu4l4mhbtdSQW6VYwbSFhC8eDkSVH+5fhSGtW94tJz4dZ1Bq8BoO8A7 phxXAgtZ3BPxbnpGH9k5ft0JZ15SDlkzW1458DDRxJuvmrCmwIq36rO8TEOs2Z1l/jX5 3Tqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=/Mqm5NLjImIYS16X8WHi66jKS9/dDWkoWlmg3vq+u2w=; b=V5P75McGW6/dy13raP7+8agvVLnY4GBJgWKeJA2VuCCczR7Pde8maQek5xUocXdDfy hOWUXActqc73Rb5ppfsWJTvfBYT+IhrQbcv01bqKGRFgVZhn+V9ryYDUOM10hhu3hJlG aTqWvJyda4DMLH9t7+0Lxq/Ml6Jku/jyRaFR5A/L04mNukh1+hwqtYXcDoM31H5jGohE CnL1JFc0Z+d8g1D8GjGTh5UukAttauDzlYZZ7+t+VOssyTbox5nwSo4IZTyt1Mo4lgHX YZuQGgqcXNdP1a7fzrjl2DDdIvfszeS5Bi8LKox4NHg0a5YCcGN9IAd8fP5RvKKZRXvG J+IQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=E+7cjU7r; 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 26si9061378pgu.190.2018.12.10.01.39.20; Mon, 10 Dec 2018 01:39:37 -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=E+7cjU7r; 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 S1726700AbeLJIxa (ORCPT + 99 others); Mon, 10 Dec 2018 03:53:30 -0500 Received: from mail-wr1-f48.google.com ([209.85.221.48]:43674 "EHLO mail-wr1-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726526AbeLJIx3 (ORCPT ); Mon, 10 Dec 2018 03:53:29 -0500 Received: by mail-wr1-f48.google.com with SMTP id r10so9531181wrs.10 for ; Mon, 10 Dec 2018 00:53:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/Mqm5NLjImIYS16X8WHi66jKS9/dDWkoWlmg3vq+u2w=; b=E+7cjU7rX2G9g9Nq8/CJhtZLY5S59gQoL1eK7hZw1mzGeJ/Kky+rSwd5ze4gH8UGR9 gp5ojQC+RiYTFeKxyQB1Y2hks+6DVXQy0ma9PODdhZ8Se1wtHiUfBevJZPAD6eK4K927 yCW6LRV1J+mY/KgYBTorp3JtPy3kLev760zYU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/Mqm5NLjImIYS16X8WHi66jKS9/dDWkoWlmg3vq+u2w=; b=PQdIamPu5guGzgHoU3Fs7cp5TPAkVvAXsOtpD4RE674YIVKm1w0L3o/AYqXkP09qvN 4uOxzJddpWaZtMBVPPUJTUqMjfqpkAipB10+fC7DR6RK9CSMZ79bBU+wr1YribI7oiJl wvehpzwY77upXjuTCrHje964BoPzdEmQMWHfMBzK2hI3Hgqt9sH36DGx6AX+EhtUCAR/ zv++u1b0x56DrXZ97Fym/kTBA7jr988ZuieqEfYQfr+xnmSsm0Ar+3vGQlVX9/QprXbS D5KPFzAmsFzi1+En+9dmcowaQ/sHmg+oj/LoiHD8HrX38yYoqMPB3HXGkrUa/SFRbxeH 0BHg== X-Gm-Message-State: AA+aEWbBW2o8ayg2AEGLWAHh6YOkVjhjDLjP7PzBkHNfcV5gvrXJYkzQ upj/B80fQbDDyyRaYwo5MTWX3Q== X-Received: by 2002:adf:d112:: with SMTP id a18mr9614787wri.17.1544432006964; Mon, 10 Dec 2018 00:53:26 -0800 (PST) Received: from localhost.localdomain ([209.250.228.18]) by smtp.gmail.com with ESMTPSA id m4sm9097351wml.2.2018.12.10.00.53.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 10 Dec 2018 00:53:26 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Mathieu Poirier , Alexander Shishkin , Jiri Olsa , Namhyung Kim , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Coresight ML Cc: Leo Yan , Mike Leach , Robert Walker Subject: [PATCH v2 2/6] perf cs-etm: Avoid stale branch samples when flush packet Date: Mon, 10 Dec 2018 16:52:57 +0800 Message-Id: <1544431981-24144-3-git-send-email-leo.yan@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544431981-24144-1-git-send-email-leo.yan@linaro.org> References: <1544431981-24144-1-git-send-email-leo.yan@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org At the end of trace buffer handling, function cs_etm__flush() is invoked to flush any remaining branch stack entries. As a side effect, it also generates branch sample, because the 'etmq->packet' doesn't contains any new coming packet but point to one stale packet after packets swapping, so it wrongly makes synthesize branch samples with stale packet info. We could review below detailed flow which causes issue: Packet1: start_addr=0xffff000008b1fbf0 end_addr=0xffff000008b1fbfc Packet2: start_addr=0xffff000008b1fb5c end_addr=0xffff000008b1fb6c step 1: cs_etm__sample(): sample: ip=(0xffff000008b1fbfc-4) addr=0xffff000008b1fb5c step 2: flush packet in cs_etm__run_decoder(): cs_etm__run_decoder() `-> err = cs_etm__flush(etmq, false); sample: ip=(0xffff000008b1fb6c-4) addr=0xffff000008b1fbf0 Packet1 and packet2 are two continuous packets, when packet2 is the new coming packet, cs_etm__sample() generates branch sample for these two packets and use [packet1::end_addr - 4 => packet2::start_addr] as branch jump flow, thus we can see the first generated branch sample in step 1. At the end of cs_etm__sample() it swaps packets so 'etm->prev_packet'= packet2 and 'etm->packet'=packet1, so far it's okay for branch sample. If packet2 is the last one packet in trace buffer, even there have no any new coming packet, cs_etm__run_decoder() invokes cs_etm__flush() to flush branch stack entries as expected, but it also generates branch samples by taking 'etm->packet' as a new coming packet, thus the branch jump flow is as [packet2::end_addr - 4 => packet1::start_addr]; this is the second sample which is generated in step 2. So actually the second sample is a stale sample and we should not generate it. This patch introduces a new function cs_etm__end_block(), at the end of trace block this function is invoked to only flush branch stack entries and thus can avoid to generate branch sample for stale packet. Cc: Mathieu Poirier Cc: Mike Leach Cc: Robert Walker Signed-off-by: Leo Yan --- tools/perf/util/cs-etm.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 789707b..ffc4fe5 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -1055,6 +1055,39 @@ static int cs_etm__flush(struct cs_etm_queue *etmq) return err; } +static int cs_etm__end_block(struct cs_etm_queue *etmq) +{ + int err; + + /* + * It has no new packet coming and 'etmq->packet' contains the stale + * packet which was set at the previous time with packets swapping; + * so skip to generate branch sample to avoid stale packet. + * + * For this case only flush branch stack and generate a last branch + * event for the branches left in the circular buffer at the end of + * the trace. + */ + if (etmq->etm->synth_opts.last_branch && + etmq->prev_packet->sample_type == CS_ETM_RANGE) { + /* + * 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); + if (err) + return err; + + etmq->period_instructions = 0; + } + + return 0; +} + static int cs_etm__run_decoder(struct cs_etm_queue *etmq) { struct cs_etm_auxtrace *etm = etmq->etm; @@ -1137,7 +1170,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) if (err == 0) /* Flush any remaining branch stack entries */ - err = cs_etm__flush(etmq); + err = cs_etm__end_block(etmq); } return err; -- 2.7.4