Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4005673pxv; Tue, 13 Jul 2021 08:41:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzzVClibsVG2/qaFFRwpnCF9K7MaTylbLpwIoIziWxd5xcKo3He+JPvbAdnqrIeSWKNTYSd X-Received: by 2002:a05:6638:1507:: with SMTP id b7mr4534842jat.23.1626190898864; Tue, 13 Jul 2021 08:41:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626190898; cv=none; d=google.com; s=arc-20160816; b=k4w7l/H+pGp1k6xEEIWyHDe7PBOd77K1pP7+Xs4Rtm9lYsc6jxfC6GE7H/Y+LqWwoS lcmW7+flTLTRyafu++9sm9dJ9G5bEDKJIFKcVKd2f2kypZnc8XRO9OMvX2n9Bqygzh1u kUc4NySMJt4OoXifa3kwe62kNJejY5R9s99TfFnK3k136ztL1Y2B3wezqaWyH1ppmFFv 4WVOzsdnnaaMaGmGklAchDmmPneDpYCPtWvs85K3p/gFQz7qD7RSu5yHTmvMoQRtcjWm rMiSsxx/pNd+O8ZaxNQWbkqFHi6ifEkQEdy+hYpgFUvnDU2wfbMZ+uMVq23hEd5pVmKi nmmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=5qSfeFOrgftBHH7seuSveuJf5KPTACgeMkGOeXp/2KE=; b=EkyHJ/dRgas+fNz2LasLIY2tZeex5Ml2ZUunhrl3+e/h7uDon9isBTCl1HicoHmqYG amACawTVXFLYV6bs8Q9GTDRmCfU54kEsa5Fwyzc99ZTEEkArfQH3oYCMddZ2XUhePgkS gmhk4VTbOJ+iiffgNnKww0RwsTQLvWeNR2I95eS9VZR7T20n7tNmQOoyBVBPV5VZyJha qurpqp0gnroGjAB3IC2YCGPibcLiRe07MxFyShnE1hwyvVqzlGCDjiqhySRVSKnxd76V AJeRW0x/9kriL+GMtFqKRLFxbigqKNFuCiCTJvQi//FhvM6aTBtHHP4gBiXcox6C/ZRX pVxw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q11si1849901ilv.18.2021.07.13.08.41.25; Tue, 13 Jul 2021 08:41:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237094AbhGMPnd (ORCPT + 99 others); Tue, 13 Jul 2021 11:43:33 -0400 Received: from foss.arm.com ([217.140.110.172]:45576 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237020AbhGMPnd (ORCPT ); Tue, 13 Jul 2021 11:43:33 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 40D7E6D; Tue, 13 Jul 2021 08:40:43 -0700 (PDT) Received: from e121896.arm.com (unknown [10.57.35.35]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E63593F774; Tue, 13 Jul 2021 08:40:38 -0700 (PDT) From: James Clark To: acme@kernel.org, mathieu.poirier@linaro.org, coresight@lists.linaro.org, leo.yan@linaro.org Cc: al.grant@arm.com, branislav.rankov@arm.com, suzuki.poulose@arm.com, anshuman.khandual@arm.com, James Clark , Mike Leach , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , John Garry , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/6] perf cs-etm: Split setup and timestamp search functions Date: Tue, 13 Jul 2021 16:40:04 +0100 Message-Id: <20210713154008.29656-3-james.clark@arm.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20210713154008.29656-1-james.clark@arm.com> References: <20210713154008.29656-1-james.clark@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This refactoring has some benefits: * Decoding is done to find the timestamp. If we want to print errors when maps aren't available, then doing it from cs_etm__setup_queue() may cause warnings to be printed. * The cs_etm__setup_queue() flow is shared between timed and timeless modes, so it needs to be guarded by an if statement which can now be removed. * Allows moving the setup queues function earlier. * If data was piped in, then not all queues would be filled so it wouldn't have worked properly anyway. Now it waits for flush so data in all queues will be available. The motivation for this is to decouple setup functions with ones that involve decoding. That way we can move the setup function earlier when the formatted/unformatted trace information is available. Signed-off-by: James Clark --- tools/perf/util/cs-etm.c | 41 ++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 4c69ef391f60..426e99c07ca9 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -809,29 +809,32 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, struct auxtrace_queue *queue, unsigned int queue_nr) { - int ret = 0; - unsigned int cs_queue_nr; - u8 trace_chan_id; - u64 cs_timestamp; struct cs_etm_queue *etmq = queue->priv; if (list_empty(&queue->head) || etmq) - goto out; + return 0; etmq = cs_etm__alloc_queue(etm); - if (!etmq) { - ret = -ENOMEM; - goto out; - } + if (!etmq) + return -ENOMEM; queue->priv = etmq; etmq->etm = etm; etmq->queue_nr = queue_nr; etmq->offset = 0; - if (etm->timeless_decoding) - goto out; + return 0; +} + +static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm, + struct cs_etm_queue *etmq, + unsigned int queue_nr) +{ + int ret = 0; + unsigned int cs_queue_nr; + u8 trace_chan_id; + u64 cs_timestamp; /* * We are under a CPU-wide trace scenario. As such we need to know @@ -2218,13 +2221,27 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) { int ret = 0; - unsigned int cs_queue_nr, queue_nr; + unsigned int cs_queue_nr, queue_nr, i; u8 trace_chan_id; u64 cs_timestamp; struct auxtrace_queue *queue; struct cs_etm_queue *etmq; struct cs_etm_traceid_queue *tidq; + /* + * Pre-populate the heap with one entry from each queue so that we can + * start processing in time order across all queues. + */ + for (i = 0; i < etm->queues.nr_queues; i++) { + etmq = etm->queues.queue_array[i].priv; + if (!etmq) + continue; + + ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i); + if (ret) + return ret; + } + while (1) { if (!etm->heap.heap_cnt) goto out; -- 2.28.0