Received: by 2002:a05:6358:a55:b0:ec:fcf4:3ecf with SMTP id 21csp647301rwb; Fri, 13 Jan 2023 02:24:16 -0800 (PST) X-Google-Smtp-Source: AMrXdXuKOG/FPQ985QfxXrH6PDVmu/mzLsr5KAGdeTDJYIjjpDolRRrmbCWmyysscXsHW0moF0Mc X-Received: by 2002:a50:eac6:0:b0:461:d042:80db with SMTP id u6-20020a50eac6000000b00461d04280dbmr69675680edp.0.1673605455832; Fri, 13 Jan 2023 02:24:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673605455; cv=none; d=google.com; s=arc-20160816; b=lGudG7gLqmiG+XIrBOr5bSPpvDJqMESfxe5Q9wlvSXwS0sTQqxYedXu67H8DIxw6Wm 5FmuneftcsvmamF0gCYTsE3wGAIFmj3hRlmHCHMx9VyOfCuPhkCJA+GGVgUcxh4lRiYQ qsWGMpXEOg5zwoCEOFdVydBG930MQ2S5rE1OCMmmqwQ1nrQz1AyqRTbET65hVSJs+5FB KuItvhDFRiJzyupUP/XDTW18ZiVgJ0gD76dwXwaJYaNj/a1y9nDHDoEDe35nBINFoMZd lsRuravzDyTD4niLtnU3LLOzA57JEMGlhHhFlIFFGv06qQ5NAjINWT4uHU9wRH1ic7iE qMGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=L6vDn7+ndENJvssbvfUqn8C4mRczQt7E0oUKK0vCcLA=; b=A6kJ1njdiCQdgaVP0irn6rSzbXvvsNDxaK+rBcsNaypEQ/Y2CH1HnO7GnwmtTpULXB dXjeZg484Ce2yDnAi6OCFvQd1ziB4K+pnup0vPvsGV36h8EZDkF4td+a5SJuVaLdIbrt bPjHPPY8HHiBLEmddAik3Rac/uVfPaTFPTUKPAGDlP+P0KGMhYbdwBHJpcnZYei9pclU 0pbX+kZQiboL/rsa+4/8BLRSjWayMqcp1Y2f09DIpKhQDbY0YwxCpTXgsHIiNrvyae87 YV5xwx1Fxk9JuumOBsBZQkVmeRk0G4vwFNq5SESRbRR1HroJK+04zLDJD6cVGEfskVmQ ZXEQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f15-20020a0564021e8f00b0048d6ace589esi26312259edf.128.2023.01.13.02.24.03; Fri, 13 Jan 2023 02:24:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239628AbjAMJjk (ORCPT + 51 others); Fri, 13 Jan 2023 04:39:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34710 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231956AbjAMJi5 (ORCPT ); Fri, 13 Jan 2023 04:38:57 -0500 Received: from out30-97.freemail.mail.aliyun.com (out30-97.freemail.mail.aliyun.com [115.124.30.97]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C2B77CBDE; Fri, 13 Jan 2023 01:29:39 -0800 (PST) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R201e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046049;MF=renyu.zj@linux.alibaba.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---0VZU8wQj_1673602159; Received: from 30.221.147.161(mailfrom:renyu.zj@linux.alibaba.com fp:SMTPD_---0VZU8wQj_1673602159) by smtp.aliyun-inc.com; Fri, 13 Jan 2023 17:29:19 +0800 Message-ID: <078e1d75-4b83-57df-f738-4b8ac3de6391@linux.alibaba.com> Date: Fri, 13 Jan 2023 17:29:18 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PATCH v7 1/9] perf pmu: Add #slots literal support for arm64 To: Ian Rogers Cc: John Garry , linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org References: <1673601740-122788-1-git-send-email-renyu.zj@linux.alibaba.com> <1673601740-122788-2-git-send-email-renyu.zj@linux.alibaba.com> From: Jing Zhang In-Reply-To: <1673601740-122788-2-git-send-email-renyu.zj@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, ENV_AND_HDR_SPF_MATCH,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2023/1/13 下午5:22, Jing Zhang 写道: > The slots in each architecture may be different, so add #slots literal > to obtain the slots of different architectures, and the #slots can be > applied in the metric. Currently, The #slots just support for arm64, > and other architectures will return NAN. > > On arm64, the value of slots is from the register PMMIR_EL1.SLOT, which > I can read in /sys/bus/event_source/device/armv8_pmuv3_*/caps/slots. > PMMIR_EL1.SLOT might read as zero if the PMU version is lower than > ID_AA64DFR0_EL1_PMUVer_V3P4 or the STALL_SLOT event is not implemented. > > Signed-off-by: Jing Zhang > --- Hi Ian, I have made significant changes compared to the previous two versions, so I have not picked up your acked-by tags in this version. I look forward to your review and give me a tag again. Thank you very much. Thanks, Jing > tools/perf/arch/arm64/util/pmu.c | 34 ++++++++++++++++++++++++++++++++-- > tools/perf/util/expr.c | 5 +++++ > tools/perf/util/pmu.c | 6 ++++++ > tools/perf/util/pmu.h | 1 + > 4 files changed, 44 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/arch/arm64/util/pmu.c b/tools/perf/arch/arm64/util/pmu.c > index 477e513..5f8667b 100644 > --- a/tools/perf/arch/arm64/util/pmu.c > +++ b/tools/perf/arch/arm64/util/pmu.c > @@ -3,8 +3,9 @@ > #include > #include "../../../util/cpumap.h" > #include "../../../util/pmu.h" > +#include > > -const struct pmu_events_table *pmu_events_table__find(void) > +static struct perf_pmu *pmu_core__find_same(void) > { > struct perf_pmu *pmu = NULL; > > @@ -19,8 +20,37 @@ const struct pmu_events_table *pmu_events_table__find(void) > if (pmu->cpus->nr != cpu__max_cpu().cpu) > return NULL; > > - return perf_pmu__find_table(pmu); > + return pmu; > } > > return NULL; > } > + > +const struct pmu_events_table *pmu_events_table__find(void) > +{ > + struct perf_pmu *pmu = pmu_core__find_same(); > + > + if (pmu) > + return perf_pmu__find_table(pmu); > + > + return NULL; > +} > + > +double perf_pmu__cpu_slots_per_cycle(void) > +{ > + char path[PATH_MAX]; > + unsigned long long slots = 0; > + struct perf_pmu *pmu = pmu_core__find_same(); > + > + if (pmu) { > + scnprintf(path, PATH_MAX, > + EVENT_SOURCE_DEVICE_PATH "%s/caps/slots", pmu->name); > + /* > + * The value of slots is not greater than 32 bits, but sysfs__read_int > + * can't read value with 0x prefix, so use sysfs__read_ull instead. > + */ > + sysfs__read_ull(path, &slots); > + } > + > + return (double)slots; > +} > diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c > index 00dcde3..9d3076a 100644 > --- a/tools/perf/util/expr.c > +++ b/tools/perf/util/expr.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include "pmu.h" > > #ifdef PARSER_DEBUG > extern int expr_debug; > @@ -448,6 +449,10 @@ double expr__get_literal(const char *literal, const struct expr_scanner_ctx *ctx > result = topology->core_cpus_lists; > goto out; > } > + if (!strcmp("#slots", literal)) { > + result = perf_pmu__cpu_slots_per_cycle() ?: NAN; > + goto out; > + } > > pr_err("Unrecognized literal '%s'", literal); > out: > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > index 2bdeb89..cbb4fbf 100644 > --- a/tools/perf/util/pmu.c > +++ b/tools/perf/util/pmu.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > #include "debug.h" > #include "evsel.h" > #include "pmu.h" > @@ -1993,3 +1994,8 @@ int perf_pmu__cpus_match(struct perf_pmu *pmu, struct perf_cpu_map *cpus, > *ucpus_ptr = unmatched_cpus; > return 0; > } > + > +double __weak perf_pmu__cpu_slots_per_cycle(void) > +{ > + return NAN; > +} > diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h > index 69ca000..fd414ba 100644 > --- a/tools/perf/util/pmu.h > +++ b/tools/perf/util/pmu.h > @@ -259,4 +259,5 @@ int perf_pmu__cpus_match(struct perf_pmu *pmu, struct perf_cpu_map *cpus, > > char *pmu_find_real_name(const char *name); > char *pmu_find_alias_name(const char *name); > +double perf_pmu__cpu_slots_per_cycle(void); > #endif /* __PMU_H */