Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp1050028rdh; Mon, 25 Sep 2023 01:22:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEW6+EehKMdel/R6WcmK5HeDdYxq87y5zPVGajBskS8tlXH2juSL/5S9STBXzRtXXmo80rJ X-Received: by 2002:a17:902:bd82:b0:1c1:f1db:e86d with SMTP id q2-20020a170902bd8200b001c1f1dbe86dmr3816130pls.7.1695630131038; Mon, 25 Sep 2023 01:22:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695630131; cv=none; d=google.com; s=arc-20160816; b=r/wpRFKXp6SAq31Z40T8lUSt9Dy2jEtaqTFcIY4g/gkKXKORsEfr/iU1U1Nw0EsBw7 8ZNwjUTmuTCqU9ckIMrI8NqJXmuJMf2B9v/wi4gVM/WJkEd7dHwHieGvxxgBXwfb9cRM ygImUgygu9Hi8wfFcAaP6DilnabWQZi5EYDNWJXVrWgGJK0itdk67GCEBMAmHTZvyTFe LpFoBvghW8WvT+ePvhqjwrLHgZzoFkNN7NMBOdjxZD5/+vvi6tS6Vavy6wlvzCHQukU2 YxLuK1Ca078A7xb6D4E4VmF7i95X/AJ0cB5W1Lgk8RdRijle2ebUiCZTkiMAxa3/g0tf EP4g== 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 :dkim-signature; bh=maXPvo62ubgCncrczMERgFnT3czH3nKUvddr8EbFPPI=; fh=aicQXd2sVDKynU70/92qv+8AnsPgYK5pq7fTzS41MP4=; b=nPLGQKR0BJXuNghsDQK+6D458vQYAoPCPj3ImjI/iz5CQC8G2FIuAhL8r7YNtcR2vW dwHGFv8Y+RamkSpBYJ/9HnQ05N8BZCVGVvxsm/dZM8Y1TU/kFmYtD8AiNYPu1x45hUW5 tikbVRRB9BNduA8wQOfTnvih63Y/0ZXD/JFY4c511KvKVZtZeGUvAe08QW6SbxNHBnov nC8yhZeTiJtMd9gdJZAR6EUAKga3GKng6RRMlv3n+dlE2YFFUIWMEI7KQ+iJEgD8AGIk RR+n5kxPEfwXKUMivzBFJK6EqFzVbZO6lubiMtzdJFaznlbk9cPbX1x7XyxBHgWHBaBy AGPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="PTfn/y6n"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id e17-20020a17090301d100b001c0953d0055si9993437plh.262.2023.09.25.01.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Sep 2023 01:22:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="PTfn/y6n"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 5B90B801C593; Sun, 24 Sep 2023 23:20:03 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232037AbjIYGTy (ORCPT + 99 others); Mon, 25 Sep 2023 02:19:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232034AbjIYGTv (ORCPT ); Mon, 25 Sep 2023 02:19:51 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73C15C6; Sun, 24 Sep 2023 23:19:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695622775; x=1727158775; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ecghSVgOnRb/io0CAxu9t2Iy1WVDvqy9G8dVCxNXugg=; b=PTfn/y6nh5cXVsYlUKCb7Juoe8McC9csRZr32Fitd6AA2OyTleB2ZbtM PCvQnuAEdHAW0dIPeydnw7p73i4ioZMzNyL+bCsAvbkuh9ErDKGZlxepy qgqAuYfj8i1sQJXMkZufNEstbI3UBkRMmyjl0eTIhn9y5Sr9h1DSK5/hY G71pXbDzktOm5gV5jEJjRu2wawXmhsrOb53BPZZPCq9im07mopnksYW1X QOAArIBWtJQZeRb2cm6BtnlWMDhGSJ+z9w184Qf64A/EDAVPD42yQVIOI A8tpj8K+cJc6lBFynMnqt8B84l+rICULKbTtVxLFE78Q79xKqX+qFtCSg A==; X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="445279437" X-IronPort-AV: E=Sophos;i="6.03,174,1694761200"; d="scan'208";a="445279437" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2023 23:19:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="818494350" X-IronPort-AV: E=Sophos;i="6.03,174,1694761200"; d="scan'208";a="818494350" Received: from b49691a75598.jf.intel.com ([10.54.34.22]) by fmsmga004.fm.intel.com with ESMTP; 24 Sep 2023 23:19:15 -0700 From: weilin.wang@intel.com To: weilin.wang@intel.com, Ian Rogers , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Adrian Hunter , Kan Liang Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Perry Taylor , Samantha Alt , Caleb Biggers , Mark Rutland Subject: [RFC PATCH 08/25] perf stat: Add functions to get counter info Date: Sun, 24 Sep 2023 23:18:07 -0700 Message-Id: <20230925061824.3818631-9-weilin.wang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20230925061824.3818631-1-weilin.wang@intel.com> References: <20230925061824.3818631-1-weilin.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Sun, 24 Sep 2023 23:20:03 -0700 (PDT) From: Weilin Wang Add data structure metricgroup__pmu_counters to represent hardware counters available in the system. Add functions to parse pmu-events and create the list of pmu_info_list to hold the counter information of the system. Signed-off-by: Weilin Wang --- tools/perf/util/metricgroup.c | 59 +++++++++++++++++++++++++++++++++-- tools/perf/util/metricgroup.h | 15 +++++++++ tools/perf/util/pmu.c | 5 +++ tools/perf/util/pmu.h | 1 + 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 7f2c1b017..feb5dab26 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1598,8 +1598,8 @@ static int get_metricgroup_events(const char *full_id, .event_name = id, .event_id = full_id, }; - ret = pmu_events_table_for_each_event(table, - metricgroup__add_metric_event_callback, &data); + ret = pmu_events_table__for_each_event(table, /*pmu=*/NULL, + metricgroup__add_metric_event_callback, &data); if (ret) goto out; } @@ -1609,6 +1609,56 @@ static int get_metricgroup_events(const char *full_id, return ret; } +static struct metricgroup__pmu_counters *pmu_layout__new(const struct pmu_layout *pl) +{ + struct metricgroup__pmu_counters *l; + l = zalloc(sizeof(*l)); + + if (!l) + return NULL; + + l->name = pl->pmu; + l->size = pl->size; + l->fixed_size = pl->fixed_size; + pr_debug("create new pmu_layout: [pmu]=%s, [gp_size]=%ld, [fixed_size]=%ld\n", + l->name, l->size, l->fixed_size); + return l; +} + +static int metricgroup__add_pmu_layout_callback(const struct pmu_layout *pl, + void *data) +{ + struct metricgroup__pmu_counters *pmu; + struct list_head *d = data; + int ret = 0; + + pmu = pmu_layout__new(pl); + if (!pmu) + return -ENOMEM; + list_add(&pmu->nd, d); + return ret; +} + +/** + * get_pmu_counter_layouts - Find counter info of the architecture from + * the pmu_layouts table + * @pmu_info_list: the list that the new counter info of a pmu is added to. + * @table: pmu_layouts table that is searched for counter info. + */ +static int get_pmu_counter_layouts(struct list_head *pmu_info_list, + const struct pmu_layouts_table + *table) +{ + LIST_HEAD(list); + int ret; + + ret = pmu_layouts_table__for_each_layout(table, + metricgroup__add_pmu_layout_callback, &list); + + list_splice(&list, pmu_info_list); + return ret; +} + /** * hw_aware_build_grouping - Build event groupings by reading counter * requirement of the events and counter available on the system from @@ -1627,6 +1677,7 @@ static int hw_aware_build_grouping(struct expr_parse_ctx *ctx __maybe_unused, LIST_HEAD(event_info_list); size_t bkt; const struct pmu_events_table *etable = pmu_events_table__find(); + const struct pmu_layouts_table *ltable = pmu_layouts_table__find(); #define RETURN_IF_NON_ZERO(x) do { if (x) return x; } while (0) hashmap__for_each_entry(ctx->ids, cur, bkt) { @@ -1638,6 +1689,10 @@ static int hw_aware_build_grouping(struct expr_parse_ctx *ctx __maybe_unused, if (ret) return ret; } + ret = get_pmu_counter_layouts(&pmu_info_list, ltable); + if (ret) + return ret; + return ret; #undef RETURN_IF_NON_ZERO diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h index e493f6965..8ee7b434e 100644 --- a/tools/perf/util/metricgroup.h +++ b/tools/perf/util/metricgroup.h @@ -85,6 +85,21 @@ struct metricgroup__event_info { DECLARE_BITMAP(counters, NR_COUNTERS); }; +/** + * A node is the counter availability of a pmu. + * This info is built up at the beginning from JSON file and + * used as a reference in metric grouping process. +*/ +struct metricgroup__pmu_counters { + struct list_head nd; + /** The name of the pmu the event collected on. */ + const char *name; + //DECLARE_BITMAP(counter_bits, NR_COUNTERS); + /** The number of gp counters in the pmu. */ + size_t size; + size_t fixed_size; +}; + /** * Each group is one node in the group string list. */ diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index cde33e019..af4056a88 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -813,6 +813,11 @@ __weak const struct pmu_metrics_table *pmu_metrics_table__find(void) return perf_pmu__find_metrics_table(NULL); } +__weak const struct pmu_layouts_table *pmu_layouts_table__find(void) +{ + return perf_pmu__find_layouts_table(NULL); +} + /** * perf_pmu__match_ignoring_suffix - Does the pmu_name match tok ignoring any * trailing suffix? The Suffix must be in form diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 6a4e170c6..3e9243e00 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -240,6 +240,7 @@ void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, char *perf_pmu__getcpuid(struct perf_pmu *pmu); const struct pmu_events_table *pmu_events_table__find(void); const struct pmu_metrics_table *pmu_metrics_table__find(void); +const struct pmu_layouts_table *pmu_layouts_table__find(void); int perf_pmu__convert_scale(const char *scale, char **end, double *sval); -- 2.39.3