From patchwork Tue Aug 27 16:51:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 13779825 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 894F5C5472F for ; Tue, 27 Aug 2024 16:57:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=AgH4V8/Dt4jy1CjykRdVTyuGgMdaHVhocBmU4Pjdi7c=; b=2qItaJS2TEKw0cjwNNyKRXwz3N UYaRj+zj/lBx4ZgoAor6BwfSLtJaBSmAP4nJEpISYS/xQOG/zXyYq9PyzU4pVVL3enSdDjQQeiKrq aJJdRR9eM0yqWJlvXmvdoCAkf4/F8Ct/6Ch/BHyrmJfEctZcPEmaC2rquBGzUNSSMfCqATAR0EB9f JT2HvXICrbfLGNqKY8QaERhsned75q15PoMHR3XUNMDOKIU1kd2ja7CNRnlJoeoKwSHb/NHesbism Y3iAMB3uAlUgXiJoQ/EtP5dyoNvYVx6TDiZgM02dcgS600uRMT8rcfXNNhaIl9UpmUedi8+UO83ir Q81TtMuA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sizVl-0000000CAp1-1seU; Tue, 27 Aug 2024 16:57:41 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sizQ7-0000000C97Y-4A16 for linux-arm-kernel@lists.infradead.org; Tue, 27 Aug 2024 16:51:53 +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 C83DD11FB; Tue, 27 Aug 2024 09:52:17 -0700 (PDT) Received: from e132581.cambridge.arm.com (e132581.arm.com [10.2.76.71]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 956553F66E; Tue, 27 Aug 2024 09:51:49 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , James Clark , Namhyung Kim , Ian Rogers , Jiri Olsa , Adrian Hunter , John Garry , Will Deacon , Mark Rutland , Mike Leach , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Leo Yan Subject: [PATCH v1 4/7] perf arm-spe: Use metadata to decide the data source feature Date: Tue, 27 Aug 2024 17:51:22 +0100 Message-Id: <20240827165125.3311306-5-leo.yan@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240827165125.3311306-1-leo.yan@arm.com> References: <20240827165125.3311306-1-leo.yan@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240827_095152_137371_274C7414 X-CRM114-Status: GOOD ( 22.62 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Use the info in the metadata to decide if the data source feature is supported. The two factors are involving the decision, one is the CPU MIDR which must be in the CPU list for the common data source encoding, and another one is the Load Data Source (LDS) capacity. For the metadata version 1, it doesn't include info for MIDR and LDS. In this case, due to absent info for making decision, print out warning to remind users to upgrade tool and returns false. If the perf data contains the metadata version 2, only above two conditions are met, it is safe to say the data source packet complies the common encoding. Otherwise, it returns false. Signed-off-by: Leo Yan --- tools/perf/util/arm-spe.c | 68 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c index e7ad52215066..600b8b031539 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c @@ -278,6 +278,20 @@ static int arm_spe_set_tid(struct arm_spe_queue *speq, pid_t tid) return 0; } +static u64 *arm_spe__get_metadata_by_cpu(struct arm_spe *spe, u64 cpu) +{ + u64 i; + + if (!spe->metadata) + return NULL; + + for (i = 0; i < spe->metadata_num_cpu; i++) + if (spe->metadata[i][ARM_SPE_CPU] == cpu) + return spe->metadata[i]; + + return NULL; +} + static struct simd_flags arm_spe__synth_simd_flags(const struct arm_spe_record *record) { struct simd_flags simd_flags = {}; @@ -520,10 +534,58 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record, data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1; } -static u64 arm_spe__synth_data_source(const struct arm_spe_record *record, u64 midr) +static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq) +{ + struct arm_spe *spe = speq->spe; + bool is_in_cpu_list; + u64 *metadata = NULL; + u64 midr = 0, lds = 0; + + /* + * Metadata version 1 doesn't contain any info for MIDR and LDS. + * Simply return false in this case. + */ + if (spe->metadata_ver == 1) { + pr_warning_once("The data file contains metadata version 1, " + "which is absent the info for data source. " + "Please upgrade the tool to record data.\n"); + return false; + } + + /* CPU ID is -1 for per-thread mode */ + if (speq->cpu < 0) { + /* + * On the heterogeneous system, due to CPU ID is -1, + * cannot confirm the data source packet is supported. + */ + if (!spe->is_homogeneous) + return false; + + /* In homogeneous system, simply use CPU0's metadata */ + if (spe->metadata) + metadata = spe->metadata[0]; + } else { + metadata = arm_spe__get_metadata_by_cpu(spe, speq->cpu); + } + + if (!metadata) + return false; + + midr = metadata[ARM_SPE_CPU_MIDR]; + lds = metadata[ARM_SPE_CAP_LDS]; + + is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus); + if (is_in_cpu_list && lds) + return true; + else + return false; +} + +static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq, + const struct arm_spe_record *record) { union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA }; - bool is_common = is_midr_in_range_list(midr, common_ds_encoding_cpus); + bool is_common = arm_spe__is_common_ds_encoding(speq); if (record->op & ARM_SPE_OP_LD) data_src.mem_op = PERF_MEM_OP_LOAD; @@ -556,7 +618,7 @@ static int arm_spe_sample(struct arm_spe_queue *speq) u64 data_src; int err; - data_src = arm_spe__synth_data_source(record, spe->midr); + data_src = arm_spe__synth_data_source(speq, record); if (spe->sample_flc) { if (record->type & ARM_SPE_L1D_MISS) {