From nobody Tue Jun 30 19:06:51 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C6E0C433F5 for ; Tue, 11 Jan 2022 15:08:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245705AbiAKPI3 (ORCPT ); Tue, 11 Jan 2022 10:08:29 -0500 Received: from foss.arm.com ([217.140.110.172]:47824 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244776AbiAKPIZ (ORCPT ); Tue, 11 Jan 2022 10:08:25 -0500 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 124AA1FB; Tue, 11 Jan 2022 07:08:25 -0800 (PST) Received: from e124483.arm.com (unknown [10.57.36.170]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 2E7923F774; Tue, 11 Jan 2022 07:08:22 -0800 (PST) From: Andrew Kilroy To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, john.garry@huawei.com, irogers@google.com, ak@linux.intel.com Cc: Andrew Kilroy , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [RFC PATCH v2 1/5] perf stat: Implement --topdown with metrics Date: Tue, 11 Jan 2022 15:07:45 +0000 Message-Id: <20220111150749.13365-2-andrew.kilroy@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111150749.13365-1-andrew.kilroy@arm.com> References: <4fefb1bc-49b2-bc5b-23cd-cd8fabe8c588@huawei.com> <20220111150749.13365-1-andrew.kilroy@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch implements the --topdown option by making use of metrics to dictate what counters are obtained in order to show the various topdown columns, e.g. Frontend Bound, Backend Bound, Retiring and Bad Speculation. The MetricGroup name is used to identify which set of metrics are to be shown. For the moment use TopDownL1 and enable for arm64 Signed-off-by: Andrew Kilroy --- tools/perf/builtin-stat.c | 13 +++++++++++++ tools/perf/util/metricgroup.c | 12 ++++++++++++ tools/perf/util/metricgroup.h | 7 +++++++ tools/perf/util/topdown.c | 10 ++++++++++ tools/perf/util/topdown.h | 1 + 5 files changed, 43 insertions(+) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index f6ca2b054c5b..975b1e0edaf4 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1856,6 +1856,18 @@ static int add_default_attributes(void) if (!force_metric_only) stat_config.metric_only =3D true; =20 + if (topdown_can_use_json_metrics()) { + if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1", + stat_config.metric_no_group, + stat_config.metric_no_merge, + &stat_config.metric_events) < 0) { + pr_err("Could not form list of metrics for topdown\n"); + return -1; + } + + goto end_of_topdown_setup; + } + if (pmu_have_event("cpu", topdown_metric_L2_attrs[5])) { metric_attrs =3D topdown_metric_L2_attrs; max_level =3D 2; @@ -1919,6 +1931,7 @@ static int add_default_attributes(void) fprintf(stderr, "System does not support topdown\n"); return -1; } +end_of_topdown_setup: free(str); } =20 diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 51c99cb08abf..9b0394372096 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -1535,6 +1535,18 @@ int metricgroup__parse_groups(const struct option *o= pt, metric_no_merge, NULL, metric_events, map); } =20 +int metricgroup__parse_groups_to_evlist(struct evlist *perf_evlist, + const char *str, + bool metric_no_group, + bool metric_no_merge, + struct rblist *metric_events) +{ + const struct pmu_events_map *map =3D pmu_events_map__find(); + + return parse_groups(perf_evlist, str, metric_no_group, + metric_no_merge, NULL, metric_events, map); +} + int metricgroup__parse_groups_test(struct evlist *evlist, const struct pmu_events_map *map, const char *str, diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h index 2b42b778d1bf..1f143ad1d9e1 100644 --- a/tools/perf/util/metricgroup.h +++ b/tools/perf/util/metricgroup.h @@ -70,6 +70,13 @@ int metricgroup__parse_groups(const struct option *opt, bool metric_no_group, bool metric_no_merge, struct rblist *metric_events); + +int metricgroup__parse_groups_to_evlist(struct evlist *perf_evlist, + const char *str, + bool metric_no_group, + bool metric_no_merge, + struct rblist *metric_events); + const struct pmu_event *metricgroup__find_metric(const char *metric, const struct pmu_events_map *map); int metricgroup__parse_groups_test(struct evlist *evlist, diff --git a/tools/perf/util/topdown.c b/tools/perf/util/topdown.c index 1081b20f9891..a542dddd97f3 100644 --- a/tools/perf/util/topdown.c +++ b/tools/perf/util/topdown.c @@ -56,3 +56,13 @@ __weak bool arch_topdown_sample_read(struct evsel *leade= r __maybe_unused) { return false; } + +bool topdown_can_use_json_metrics(void) +{ +#if defined(__aarch64__) + return true; +#else + return false; +#endif +} + diff --git a/tools/perf/util/topdown.h b/tools/perf/util/topdown.h index 2f0d0b887639..3e28f77443d3 100644 --- a/tools/perf/util/topdown.h +++ b/tools/perf/util/topdown.h @@ -8,5 +8,6 @@ void arch_topdown_group_warn(void); bool arch_topdown_sample_read(struct evsel *leader); =20 int topdown_filter_events(const char **attr, char **str, bool use_group); +bool topdown_can_use_json_metrics(void); =20 #endif --=20 2.17.1 From nobody Tue Jun 30 19:06:51 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BA51C433F5 for ; Tue, 11 Jan 2022 15:08:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244994AbiAKPId (ORCPT ); Tue, 11 Jan 2022 10:08:33 -0500 Received: from foss.arm.com ([217.140.110.172]:47848 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245127AbiAKPIa (ORCPT ); Tue, 11 Jan 2022 10:08:30 -0500 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 2F61DED1; Tue, 11 Jan 2022 07:08:30 -0800 (PST) Received: from e124483.arm.com (unknown [10.57.36.170]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 064D23F774; Tue, 11 Jan 2022 07:08:27 -0800 (PST) From: Andrew Kilroy To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, john.garry@huawei.com, irogers@google.com, ak@linux.intel.com Cc: Andrew Kilroy , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [RFC PATCH v2 2/5] perf stat: Topdown kernel events setup function Date: Tue, 11 Jan 2022 15:07:46 +0000 Message-Id: <20220111150749.13365-3-andrew.kilroy@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111150749.13365-1-andrew.kilroy@arm.com> References: <4fefb1bc-49b2-bc5b-23cd-cd8fabe8c588@huawei.com> <20220111150749.13365-1-andrew.kilroy@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Move the code block that sets up topdown by using kernel events into its own function. Signed-off-by: Andrew Kilroy --- tools/perf/builtin-stat.c | 157 ++++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 75 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 975b1e0edaf4..ab956ac97d94 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1649,6 +1649,84 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) return 0; } =20 +static int try_non_json_metrics_topdown(void) +{ + int err; + const char **metric_attrs =3D topdown_metric_attrs; + unsigned int max_level =3D 1; + char *str =3D NULL; + bool warn =3D false; + + if (!force_metric_only) + stat_config.metric_only =3D true; + + if (pmu_have_event("cpu", topdown_metric_L2_attrs[5])) { + metric_attrs =3D topdown_metric_L2_attrs; + max_level =3D 2; + } + + if (stat_config.topdown_level > max_level) { + pr_err("Invalid top-down metrics level. The max level is %u.\n", max_lev= el); + return -1; + } else if (!stat_config.topdown_level) + stat_config.topdown_level =3D max_level; + + if (topdown_filter_events(metric_attrs, &str, 1) < 0) { + pr_err("Out of memory\n"); + return -1; + } + if (metric_attrs[0] && str) { + if (!stat_config.interval && !stat_config.metric_only) { + fprintf(stat_config.output, + "Topdown accuracy may decrease when measuring long periods.\n" + "Please print the result regularly, e.g. -I1000\n"); + } + goto setup_metrics; + } + + zfree(&str); + + if (stat_config.aggr_mode !=3D AGGR_GLOBAL && + stat_config.aggr_mode !=3D AGGR_CORE) { + pr_err("top down event configuration requires --per-core mode\n"); + return -1; + } + stat_config.aggr_mode =3D AGGR_CORE; + if (nr_cgroups || !target__has_cpu(&target)) { + pr_err("top down event configuration requires system-wide mode (-a)\n"); + return -1; + } + + if (topdown_filter_events(topdown_attrs, &str, + arch_topdown_check_group(&warn)) < 0) { + pr_err("Out of memory\n"); + return -1; + } + if (topdown_attrs[0] && str) { + struct parse_events_error errinfo; + if (warn) + arch_topdown_group_warn(); +setup_metrics: + parse_events_error__init(&errinfo); + err =3D parse_events(evsel_list, str, &errinfo); + if (err) { + fprintf(stderr, + "Cannot set up top down events %s: %d\n", + str, err); + parse_events_error__print(&errinfo, str); + parse_events_error__exit(&errinfo); + free(str); + return -1; + } + parse_events_error__exit(&errinfo); + } else { + fprintf(stderr, "System does not support topdown\n"); + return -1; + } + free(str); + return err; +} + /* * Add default attributes, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: @@ -1848,14 +1926,6 @@ static int add_default_attributes(void) } =20 if (topdown_run) { - const char **metric_attrs =3D topdown_metric_attrs; - unsigned int max_level =3D 1; - char *str =3D NULL; - bool warn =3D false; - - if (!force_metric_only) - stat_config.metric_only =3D true; - if (topdown_can_use_json_metrics()) { if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1", stat_config.metric_no_group, @@ -1864,75 +1934,12 @@ static int add_default_attributes(void) pr_err("Could not form list of metrics for topdown\n"); return -1; } - - goto end_of_topdown_setup; - } - - if (pmu_have_event("cpu", topdown_metric_L2_attrs[5])) { - metric_attrs =3D topdown_metric_L2_attrs; - max_level =3D 2; - } - - if (stat_config.topdown_level > max_level) { - pr_err("Invalid top-down metrics level. The max level is %u.\n", max_le= vel); - return -1; - } else if (!stat_config.topdown_level) - stat_config.topdown_level =3D max_level; - - if (topdown_filter_events(metric_attrs, &str, 1) < 0) { - pr_err("Out of memory\n"); - return -1; - } - if (metric_attrs[0] && str) { - if (!stat_config.interval && !stat_config.metric_only) { - fprintf(stat_config.output, - "Topdown accuracy may decrease when measuring long periods.\n" - "Please print the result regularly, e.g. -I1000\n"); - } - goto setup_metrics; - } - - zfree(&str); - - if (stat_config.aggr_mode !=3D AGGR_GLOBAL && - stat_config.aggr_mode !=3D AGGR_CORE) { - pr_err("top down event configuration requires --per-core mode\n"); - return -1; - } - stat_config.aggr_mode =3D AGGR_CORE; - if (nr_cgroups || !target__has_cpu(&target)) { - pr_err("top down event configuration requires system-wide mode (-a)\n"); - return -1; - } - - if (topdown_filter_events(topdown_attrs, &str, - arch_topdown_check_group(&warn)) < 0) { - pr_err("Out of memory\n"); - return -1; - } - if (topdown_attrs[0] && str) { - struct parse_events_error errinfo; - if (warn) - arch_topdown_group_warn(); -setup_metrics: - parse_events_error__init(&errinfo); - err =3D parse_events(evsel_list, str, &errinfo); - if (err) { - fprintf(stderr, - "Cannot set up top down events %s: %d\n", - str, err); - parse_events_error__print(&errinfo, str); - parse_events_error__exit(&errinfo); - free(str); - return -1; - } - parse_events_error__exit(&errinfo); } else { - fprintf(stderr, "System does not support topdown\n"); - return -1; + err =3D try_non_json_metrics_topdown(); + if (err) + return err; } -end_of_topdown_setup: - free(str); + } =20 if (!evsel_list->core.nr_entries) { --=20 2.17.1 From nobody Tue Jun 30 19:06:51 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59AE4C433F5 for ; Tue, 11 Jan 2022 15:08:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349415AbiAKPIj (ORCPT ); Tue, 11 Jan 2022 10:08:39 -0500 Received: from foss.arm.com ([217.140.110.172]:47868 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245726AbiAKPIg (ORCPT ); Tue, 11 Jan 2022 10:08:36 -0500 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 845A7ED1; Tue, 11 Jan 2022 07:08:36 -0800 (PST) Received: from e124483.arm.com (unknown [10.57.36.170]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D27533F774; Tue, 11 Jan 2022 07:08:33 -0800 (PST) From: Andrew Kilroy To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, john.garry@huawei.com, irogers@google.com, ak@linux.intel.com Cc: Andrew Kilroy , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [RFC PATCH v2 3/5] perf stat: Topdown json metrics setup function Date: Tue, 11 Jan 2022 15:07:47 +0000 Message-Id: <20220111150749.13365-4-andrew.kilroy@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111150749.13365-1-andrew.kilroy@arm.com> References: <4fefb1bc-49b2-bc5b-23cd-cd8fabe8c588@huawei.com> <20220111150749.13365-1-andrew.kilroy@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Move into its own function, the set up of json metrics to measure L1 topdown statistics Also move the setup of the metrics_only member of stat_config outside, since its supposed to be common to both the kernel events and json metrics implementations Signed-off-by: Andrew Kilroy --- tools/perf/builtin-stat.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index ab956ac97d94..6122f3a764f8 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1651,15 +1651,12 @@ static int perf_stat_init_aggr_mode_file(struct per= f_stat *st) =20 static int try_non_json_metrics_topdown(void) { - int err; + int err =3D 0; const char **metric_attrs =3D topdown_metric_attrs; unsigned int max_level =3D 1; char *str =3D NULL; bool warn =3D false; =20 - if (!force_metric_only) - stat_config.metric_only =3D true; - if (pmu_have_event("cpu", topdown_metric_L2_attrs[5])) { metric_attrs =3D topdown_metric_L2_attrs; max_level =3D 2; @@ -1727,6 +1724,18 @@ static int try_non_json_metrics_topdown(void) return err; } =20 +static int try_json_metrics_topdown(void) +{ + if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1", + stat_config.metric_no_group, + stat_config.metric_no_merge, + &stat_config.metric_events) < 0) { + pr_err("Could not form list of metrics for topdown\n"); + return -1; + } + return 0; +} + /* * Add default attributes, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: @@ -1926,20 +1935,18 @@ static int add_default_attributes(void) } =20 if (topdown_run) { + if (!force_metric_only) + stat_config.metric_only =3D true; + if (topdown_can_use_json_metrics()) { - if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1", - stat_config.metric_no_group, - stat_config.metric_no_merge, - &stat_config.metric_events) < 0) { - pr_err("Could not form list of metrics for topdown\n"); - return -1; - } + err =3D try_json_metrics_topdown(); + if (err) + return err; } else { err =3D try_non_json_metrics_topdown(); if (err) return err; } - } =20 if (!evsel_list->core.nr_entries) { --=20 2.17.1 From nobody Tue Jun 30 19:06:51 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F2505C433FE for ; Tue, 11 Jan 2022 15:08:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241376AbiAKPIo (ORCPT ); Tue, 11 Jan 2022 10:08:44 -0500 Received: from foss.arm.com ([217.140.110.172]:47886 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242050AbiAKPIm (ORCPT ); Tue, 11 Jan 2022 10:08:42 -0500 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 4399EED1; Tue, 11 Jan 2022 07:08:42 -0800 (PST) Received: from e124483.arm.com (unknown [10.57.36.170]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C3B5F3F774; Tue, 11 Jan 2022 07:08:39 -0800 (PST) From: Andrew Kilroy To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, john.garry@huawei.com, irogers@google.com, ak@linux.intel.com Cc: Andrew Kilroy , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [RFC PATCH v2 4/5] perf stat: Detect if topdown kernel events supported Date: Tue, 11 Jan 2022 15:07:48 +0000 Message-Id: <20220111150749.13365-5-andrew.kilroy@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111150749.13365-1-andrew.kilroy@arm.com> References: <4fefb1bc-49b2-bc5b-23cd-cd8fabe8c588@huawei.com> <20220111150749.13365-1-andrew.kilroy@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch checks if the kernel events topdown implementation can be set up. Do this by iterating over two arrays defining what kernel events should be present. If one of those arrays define at least one event that is present, the kernel events are supported. If no topdown kernel events are detected, the json metrics approach is attempted. Signed-off-by: Andrew Kilroy --- tools/perf/builtin-stat.c | 114 +++++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 8 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 6122f3a764f8..2f579d29f9f5 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -93,6 +93,7 @@ =20 #include #include +#include =20 #define DEFAULT_SEPARATOR " " #define FREEZE_ON_SMI_PATH "devices/cpu/freeze_on_smi" @@ -1649,6 +1650,75 @@ static int perf_stat_init_aggr_mode_file(struct perf= _stat *st) return 0; } =20 +// Return the number of elements in the array excluding the final +// NULL array element. +static size_t str_array_len(const char **str) +{ + size_t c =3D 0; + while (str[c] !=3D NULL) { + ++c; + } + return c; +} + +// Checks if topdown kernel events listed by the given +// array of event names are supported. +// +// The input array is not modified. +// +// Returns 1 if supported, +// 0 if not supported, +// -1 if some unexpected error occurred while checking +static int check_events_available(const char **orig_events_array) +{ + char *str =3D NULL; + size_t basic_events_len =3D str_array_len(orig_events_array); + size_t basic_events_cpy_bytes =3D sizeof(const char *) * (basic_events_le= n + 1); + const char **basic_events =3D NULL; + + // This function shouldn't have any side effects. + // Since topdown_filter_events mutates the arrays it inspects, + // this function takes temporary shallow copies of the input + // string array + basic_events =3D memdup(orig_events_array, basic_events_cpy_bytes); + if (basic_events =3D=3D NULL) { + pr_err("Out of memory, could not copy topdown events array\n"); + return -1; + } + + if (topdown_filter_events(basic_events, &str, 1) < 0) { + pr_err("Out of memory, could not form events string\n"); + free(basic_events); + return -1; + } + if (basic_events[0] && str) { + free(basic_events); + free(str); + return 1; + } + free(basic_events); + free(str); + + return 0; +} + +// Checks if topdown kernel events support has been detected +// on this system. +// +// Returns 1 if supported, +// 0 if not supported, +// -1 if some unexpected error occurred while checking +static int topdown_kernel_events_supported(void) +{ + int l1_and_l2_available =3D check_events_available(topdown_metric_L2_attr= s); + + if (l1_and_l2_available =3D=3D 0) { + return check_events_available(topdown_attrs); + } else { + return l1_and_l2_available; + } +} + static int try_non_json_metrics_topdown(void) { int err =3D 0; @@ -1736,6 +1806,27 @@ static int try_json_metrics_topdown(void) return 0; } =20 +enum topdown_mechanism { + TOPDOWN_JSON_METRICS, + TOPDOWN_KERNEL_EVENTS, + TOPDOWN_DETECTION_ERROR, +}; + +static enum topdown_mechanism choose_topdown_mechanism(void) +{ + int kernel_events_supported =3D topdown_kernel_events_supported(); + + if (kernel_events_supported > 0) { + pr_debug("topdown kernel events are supported\n"); + return TOPDOWN_KERNEL_EVENTS; + } else if (kernel_events_supported =3D=3D 0) { + pr_debug("topdown kernel events are unsupported\n"); + return TOPDOWN_JSON_METRICS; + } else { + return TOPDOWN_DETECTION_ERROR; + } +} + /* * Add default attributes, if there were no attributes specified or * if -d/--detailed, -d -d or -d -d -d is used: @@ -1935,17 +2026,24 @@ static int add_default_attributes(void) } =20 if (topdown_run) { + int topdown_err =3D 0; if (!force_metric_only) stat_config.metric_only =3D true; =20 - if (topdown_can_use_json_metrics()) { - err =3D try_json_metrics_topdown(); - if (err) - return err; - } else { - err =3D try_non_json_metrics_topdown(); - if (err) - return err; + switch (choose_topdown_mechanism()) { + case TOPDOWN_JSON_METRICS: + topdown_err =3D try_json_metrics_topdown(); + break; + case TOPDOWN_DETECTION_ERROR: + return -1; + case TOPDOWN_KERNEL_EVENTS: + default: + topdown_err =3D try_non_json_metrics_topdown(); + break; + } + + if (topdown_err < 0) { + return -1; } } =20 --=20 2.17.1 From nobody Tue Jun 30 19:06:51 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAD25C4332F for ; Tue, 11 Jan 2022 15:08:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241842AbiAKPIx (ORCPT ); Tue, 11 Jan 2022 10:08:53 -0500 Received: from foss.arm.com ([217.140.110.172]:47904 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241575AbiAKPIu (ORCPT ); Tue, 11 Jan 2022 10:08:50 -0500 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 0EDF2ED1; Tue, 11 Jan 2022 07:08:50 -0800 (PST) Received: from e124483.arm.com (unknown [10.57.36.170]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 2B7C23F774; Tue, 11 Jan 2022 07:08:47 -0800 (PST) From: Andrew Kilroy To: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, acme@kernel.org, john.garry@huawei.com, irogers@google.com, ak@linux.intel.com Cc: Andrew Kilroy , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim Subject: [RFC PATCH v2 5/5] perf stat: Ensure only topdown kernel events used on x86 Date: Tue, 11 Jan 2022 15:07:49 +0000 Message-Id: <20220111150749.13365-6-andrew.kilroy@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220111150749.13365-1-andrew.kilroy@arm.com> References: <4fefb1bc-49b2-bc5b-23cd-cd8fabe8c588@huawei.com> <20220111150749.13365-1-andrew.kilroy@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Based on advice here: https://lore.kernel.org/linux-perf-users/12e0deef-08db-445f-4958-bcd5c3e1= 0367@linux.intel.com/#t Only use the existing kernel events topdown mechanism on x86, not the json metrics approach. Disabling the json metrics because of concerns that due to SMT it's not straightforward to express the various formulas as json for certain x86 cpus. Signed-off-by: Andrew Kilroy --- tools/perf/builtin-stat.c | 22 +++++++++++++--------- tools/perf/util/topdown.c | 6 +++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 2f579d29f9f5..eee58fbf1986 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1814,16 +1814,20 @@ enum topdown_mechanism { =20 static enum topdown_mechanism choose_topdown_mechanism(void) { - int kernel_events_supported =3D topdown_kernel_events_supported(); - - if (kernel_events_supported > 0) { - pr_debug("topdown kernel events are supported\n"); - return TOPDOWN_KERNEL_EVENTS; - } else if (kernel_events_supported =3D=3D 0) { - pr_debug("topdown kernel events are unsupported\n"); - return TOPDOWN_JSON_METRICS; + if (topdown_can_use_json_metrics()) { + int kernel_events_supported =3D topdown_kernel_events_supported(); + + if (kernel_events_supported > 0) { + pr_debug("topdown kernel events are supported\n"); + return TOPDOWN_KERNEL_EVENTS; + } else if (kernel_events_supported =3D=3D 0) { + pr_debug("topdown kernel events are unsupported\n"); + return TOPDOWN_JSON_METRICS; + } else { + return TOPDOWN_DETECTION_ERROR; + } } else { - return TOPDOWN_DETECTION_ERROR; + return TOPDOWN_KERNEL_EVENTS; } } =20 diff --git a/tools/perf/util/topdown.c b/tools/perf/util/topdown.c index a542dddd97f3..36f6c29009fb 100644 --- a/tools/perf/util/topdown.c +++ b/tools/perf/util/topdown.c @@ -59,10 +59,10 @@ __weak bool arch_topdown_sample_read(struct evsel *lead= er __maybe_unused) =20 bool topdown_can_use_json_metrics(void) { -#if defined(__aarch64__) - return true; -#else +#if defined(__i386__) || defined(__x86_64__) return false; +#else + return true; #endif } =20 --=20 2.17.1