From patchwork Tue Feb 9 09:58:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Clark X-Patchwork-Id: 12077645 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF820C433E6 for ; Tue, 9 Feb 2021 10:00:51 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7585464E79 for ; Tue, 9 Feb 2021 10:00:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7585464E79 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=eFLUVE+ln+zQJAprQAPV8ynxsxjIxxkx44ptSQINow4=; b=hwMHL1jEvvIlt5wQGfF3O+MMz PgnqXLSMRMORkQVwNrz0JdJ4yDzMrgLL0iulJGspftbqxXAqEqZJL9y6Y5LOBpU9DP8M14z/K6Sax tGAOsj9LSG1khYAa69Aez0PvPbBwrNpBpUMeEfI37OGldAbR/CPAB0se/ckj37P2cgxo/xUT9bFAL EThafmUVvCC6/fOajAibINtIJ7QyfNGHdawnkeGA6fSlNPMquLMtKlppXL7g+yLAS1TRdJtAL1PdV dVFG9+wh1tICfIOqlOYahkuo7KKq0QghgslYCudwCCfXIimL99VLn81LgZPRRi1N4ROg2dezXQgNG h0Dz4swLA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l9Pnw-0001qD-Fq; Tue, 09 Feb 2021 09:59:32 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l9Pns-0001o3-8i for linux-arm-kernel@lists.infradead.org; Tue, 09 Feb 2021 09:59:29 +0000 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 752CC113E; Tue, 9 Feb 2021 01:59:27 -0800 (PST) Received: from e121896.arm.com (unknown [10.57.44.191]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 58C983F73B; Tue, 9 Feb 2021 01:59:24 -0800 (PST) From: James Clark To: coresight@lists.linaro.org Subject: [RFC PATCH 3/5] perf cs-etm: Save aux records in each etm queue Date: Tue, 9 Feb 2021 11:58:55 +0200 Message-Id: <20210209095857.28419-4-james.clark@arm.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20210209095857.28419-1-james.clark@arm.com> References: <20210209095857.28419-1-james.clark@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210209_045928_699091_912EBA09 X-CRM114-Status: GOOD ( 18.19 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , branislav.rankov@arm.com, al.grant@arm.com, denik@chromium.org, Mathieu Poirier , Alexander Shishkin , Jiri Olsa , John Garry , linux-kernel@vger.kernel.org, James Clark , Leo Yan , Namhyung Kim , Will Deacon , linux-arm-kernel@lists.infradead.org, Mike Leach Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The aux records will be used set the bounds of decoding in a later commit. In the future we may also want to use the flags of each record to control decoding. Do these need to be saved in their entirety, or can pointers to each record safely be saved instead for later access? Signed-off-by: James Clark --- tools/perf/util/cs-etm.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c index 9ebe43d60d1e..efe418a7c82e 100644 --- a/tools/perf/util/cs-etm.c +++ b/tools/perf/util/cs-etm.c @@ -92,12 +92,16 @@ struct cs_etm_queue { /* Conversion between traceID and index in traceid_queues array */ struct intlist *traceid_queues_list; struct cs_etm_traceid_queue **traceid_queues; + int aux_record_list_len; + int aux_record_list_idx; + struct perf_record_aux *aux_record_list; }; /* RB tree for quick conversion between traceID and metadata pointers */ static struct intlist *traceid_list; -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm, int cpu); +static int cs_etm__update_queues(struct cs_etm_auxtrace *etm, int cpu, + struct perf_record_aux *aux_record); static int cs_etm__process_queues(struct cs_etm_auxtrace *etm); static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, pid_t tid); @@ -593,6 +597,7 @@ static void cs_etm__free_queue(void *priv) cs_etm_decoder__free(etmq->decoder); cs_etm__free_traceid_queues(etmq); + free(etmq->aux_record_list); free(etmq); } @@ -767,13 +772,22 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm) return NULL; } -static int cs_etm__seach_first_timestamp(struct cs_etm_queue *etmq) +static int cs_etm__seach_first_timestamp(struct cs_etm_queue *etmq, + struct perf_record_aux *aux_record) { int ret = 0; u64 timestamp; unsigned int cs_queue_nr; u8 trace_chan_id; + etmq->aux_record_list = reallocarray(etmq->aux_record_list, + etmq->aux_record_list_len+1, + sizeof(*etmq->aux_record_list)); + if (!etmq->aux_record_list) + return -ENOMEM; + + etmq->aux_record_list[etmq->aux_record_list_len++] = *aux_record; + /* * We are under a CPU-wide trace scenario. As such we need to know * when the code that generated the traces started to execute so that @@ -873,7 +887,7 @@ static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm) return 0; } -static int cs_etm__update_queues(struct cs_etm_auxtrace *etm, int cpu) +static int cs_etm__update_queues(struct cs_etm_auxtrace *etm, int cpu, struct perf_record_aux *aux) { int ret; if (etm->queues.new_data) { @@ -884,7 +898,7 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm, int cpu) } if (!etm->timeless_decoding) - return cs_etm__seach_first_timestamp(etm->queues.queue_array[cpu].priv); + return cs_etm__seach_first_timestamp(etm->queues.queue_array[cpu].priv, aux); else return 0; } @@ -2365,7 +2379,7 @@ static int cs_etm__process_event(struct perf_session *session, if ((timestamp || etm->timeless_decoding) && event->header.type == PERF_RECORD_AUX) { - err = cs_etm__update_queues(etm, sample->cpu); + err = cs_etm__update_queues(etm, sample->cpu, &event->aux); if (err) return err; }