From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>,
Ian Rogers <irogers@google.com>,
Kan Liang <kan.liang@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
linux-perf-users@vger.kernel.org
Subject: [RFC/PATCH 2/2] perf check: Add 'pmu' subcommand
Date: Wed, 17 Sep 2025 23:39:44 -0700 [thread overview]
Message-ID: <20250918063944.16331-2-namhyung@kernel.org> (raw)
In-Reply-To: <20250918063944.16331-1-namhyung@kernel.org>
The 'perf check pmu' command will show information about PMUs in the
system like below:
$ perf check pmu | head
cpu_atom: type = 10
core PMU: cpus = 16-27
caps: branches = 32
caps: max_precise = 3
caps: pmu_name = alderlake_hybrid
cpu_core: type = 4
core PMU: cpus = 0-15
caps: branches = 32
caps: max_precise = 3
caps: pmu_name = alderlake_hybrid
The -q option will make it print the name and type of PMUs only. It
also takes arguments to show matching PMUs only.
$ perf check pmu -q uncore
uncore_arb_0: type = 27
uncore_arb_1: type = 28
uncore_cbox_0: type = 15
uncore_cbox_1: type = 16
uncore_cbox_2: type = 17
uncore_cbox_3: type = 18
uncore_cbox_4: type = 19
uncore_cbox_5: type = 20
uncore_cbox_6: type = 21
uncore_cbox_7: type = 22
uncore_cbox_8: type = 23
uncore_cbox_9: type = 24
uncore_cbox_10: type = 25
uncore_cbox_11: type = 26
uncore_clock: type = 29
uncore_imc_free_running_0: type = 32
uncore_imc_free_running_1: type = 33
uncore_imc_0: type = 30
uncore_imc_1: type = 31
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/Documentation/perf-check.txt | 12 +++++
tools/perf/builtin-check.c | 60 ++++++++++++++++++++++++-
2 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/tools/perf/Documentation/perf-check.txt b/tools/perf/Documentation/perf-check.txt
index 34dccc29d90d2fdf..2fa007698c0f0814 100644
--- a/tools/perf/Documentation/perf-check.txt
+++ b/tools/perf/Documentation/perf-check.txt
@@ -11,6 +11,7 @@ SYNOPSIS
'perf check' [<options>]
'perf check' {feature <feature_list>} [<options>]
'perf check' {system <setting_list>} [<options>]
+'perf check' {pmu <name_list>} [<options>]
DESCRIPTION
-----------
@@ -26,6 +27,9 @@ is built-in, otherwise returns with exit status 1.
If the subcommand 'system' is used, then system settins are printed on
the standard output with explanation.
+If the subcommand 'pmu' is used, then available PMU information is printed
+on the standard output with explanation.
+
SUBCOMMANDS
-----------
@@ -88,6 +92,14 @@ SUBCOMMANDS
nmi_watchdog
kptr_restrict
+pmu::
+
+ Print PMU information available in the system.
+
+ Example Usage:
+ perf check pmu
+ perf check pmu <name>
+
OPTIONS
-------
diff --git a/tools/perf/builtin-check.c b/tools/perf/builtin-check.c
index 1c7c6bb5da5ccbf2..f3d034a94b1227c7 100644
--- a/tools/perf/builtin-check.c
+++ b/tools/perf/builtin-check.c
@@ -3,6 +3,8 @@
#include "color.h"
#include "util/debug.h"
#include "util/header.h"
+#include "util/pmu.h"
+#include "util/pmus.h"
#include <api/fs/fs.h>
#include <tools/config.h>
#include <stdbool.h>
@@ -10,13 +12,14 @@
#include <string.h>
#include <subcmd/parse-options.h>
-static const char * const check_subcommands[] = { "feature", "system", NULL };
+static const char * const check_subcommands[] = { "feature", "system", "pmu", NULL };
static struct option check_options[] = {
OPT_BOOLEAN('q', "quiet", &quiet, "do not show any warnings or messages"),
OPT_END()
};
static struct option check_feature_options[] = { OPT_PARENT(check_options) };
static struct option check_system_options[] = { OPT_PARENT(check_options) };
+static struct option check_pmu_options[] = { OPT_PARENT(check_options) };
static const char *check_usage[] = { NULL, NULL };
static const char *check_feature_usage[] = {
@@ -27,6 +30,10 @@ static const char *check_system_usage[] = {
"perf check system",
NULL
};
+static const char *check_pmu_usage[] = {
+ "perf check pmu",
+ NULL
+};
#define FEATURE_STATUS(name_, macro_) { \
.name = name_, \
@@ -278,6 +285,55 @@ static int subcommand_system(int argc, const char **argv)
return 0;
}
+/**
+ * Usage: 'perf check pmu <names>'
+ *
+ * Show PMU information.
+ */
+static int subcommand_pmu(int argc, const char **argv)
+{
+ struct perf_pmu *pmu = NULL;
+ struct perf_pmu_caps *caps;
+
+ argc = parse_options(argc, argv, check_pmu_options, check_pmu_usage, 0);
+
+ while ((pmu = perf_pmus__scan(pmu)) != NULL) {
+ if (argc) {
+ bool found = false;
+
+ /* only show entries match to command line arguments */
+ for (int k = 0; k < argc; k++) {
+ if (strstr(pmu->name, argv[k])) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ }
+
+ printf("%s: type = %u\n", pmu->name, pmu->type);
+ if (quiet)
+ continue;
+
+ if (pmu->is_core || pmu->is_uncore) {
+ printf(" %score PMU", pmu->is_uncore ? "un" : "");
+ if (!perf_cpu_map__is_empty(pmu->cpus)) {
+ printf(": %s = ", pmu->is_core ? "cpus" : "cpumask");
+ cpu_map__fprintf(pmu->cpus, stdout);
+ } else {
+ printf("\n");
+ }
+ }
+
+ perf_pmu__caps_parse(pmu);
+ list_for_each_entry(caps, &pmu->caps, list) {
+ printf(" caps: %s = %s\n", caps->name, caps->value);
+ }
+ }
+ return 0;
+}
+
int cmd_check(int argc, const char **argv)
{
argc = parse_options_subcommand(argc, argv, check_options,
@@ -290,6 +346,8 @@ int cmd_check(int argc, const char **argv)
return subcommand_feature(argc, argv);
if (strcmp(argv[0], "system") == 0)
return subcommand_system(argc, argv);
+ if (strcmp(argv[0], "pmu") == 0)
+ return subcommand_pmu(argc, argv);
/* If no subcommand matched above, print usage help */
pr_err("Unknown subcommand: %s\n", argv[0]);
--
2.51.0
next prev parent reply other threads:[~2025-09-18 6:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-18 6:39 [RFC/PATCH 1/2] perf check: Add 'system' subcommand Namhyung Kim
2025-09-18 6:39 ` Namhyung Kim [this message]
2025-09-18 15:33 ` [RFC/PATCH 2/2] perf check: Add 'pmu' subcommand Ian Rogers
2025-09-19 20:27 ` Namhyung Kim
2025-09-20 14:04 ` Ian Rogers
2025-09-18 15:48 ` [RFC/PATCH 1/2] perf check: Add 'system' subcommand Ian Rogers
2025-09-18 20:12 ` Arnaldo Carvalho de Melo
2025-09-19 20:21 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250918063944.16331-2-namhyung@kernel.org \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.