From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v1 39/41] perf sysinfo: Add sysinfo subcommand
Date: Wed, 04 Nov 2026 07:50:28 +0000 [thread overview]
Message-ID: <sashiko-outbox-196830@kernel.org> (raw)
In-Reply-To: <20261103234502.1008382-40-irogers@google.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] perf sysinfo: precise-only regs duplicated in print_pmu_json()
- [Medium] perf sysinfo: cmd_sysinfo() collapses heterogeneous core PMUs
--
commit 137020466c84fe37ed29fa37c240863bb116831f
Author: Ian Rogers <irogers@google.com>
perf sysinfo: Add sysinfo subcommand
This commit adds the perf sysinfo subcommand to display and probe PMU and
system performance monitoring capabilities on a running system or from a
perf.data file, supporting both text and JSON output modes.
> diff --git a/tools/perf/builtin-sysinfo.c b/tools/perf/builtin-sysinfo.c
> new file mode 100644
> index 0000000000000..afc4648098dd8
> --- /dev/null
> +++ b/tools/perf/builtin-sysinfo.c
> @@ -0,0 +1,2022 @@
[ ... ]
> +static bool evsel_matches_pmu(const struct evsel *evsel,
> + const struct perf_pmu *pmu, bool show_all)
> +{
> + struct perf_pmu *ev_pmu = evsel__find_pmu(evsel);
> + const char *ev_pmu_name;
> +
> + if (ev_pmu == pmu)
> + return true;
> +
> + if (ev_pmu) {
> + if (!show_all && !pmu->is_core && pmu->name && ev_pmu->name) {
> + size_t base_len = pmu_name_len_no_suffix(pmu->name);
> +
> + if (pmu_name_len_no_suffix(ev_pmu->name) == base_len &&
> + !strncmp(pmu->name, ev_pmu->name, base_len))
> + return true;
> + }
> + return false;
> + }
[ ... ]
> +static void print_pmu_json(FILE *fp, const struct perf_pmu *pmu,
> + const struct perf_session *session, bool show_all)
> +{
[ ... ]
> + print_probed_regs(fp, &buf, "UserRegisters",
> + p->user_regs_mask, p->user_regs_abi,
> + p->user_simd_mask, p->user_pred_mask,
> + /*intr=*/false, /*json=*/true);
> + print_probed_regs(fp, &buf, "IntrRegisters",
> + p->intr_regs_mask, p->intr_regs_abi,
> + p->intr_simd_mask, p->intr_pred_mask,
> + /*intr=*/true, /*json=*/true);
> + print_probed_regs(fp, &buf, "IntrRegistersPreciseOnly",
> + p->intr_regs_precise_mask, p->intr_regs_abi,
> + p->intr_simd_precise_mask, p->intr_pred_precise_mask,
> + /*intr=*/true, /*json=*/true);
[Severity: Medium]
In probe_pmu_regs_one() in tools/perf/util/pmu.c, when an interrupt register
or SIMD/predicate register class can only be sampled with precise_ip > 0, its
bit is set in both intr_regs_mask (or intr_simd_mask / intr_pred_mask) and
intr_regs_precise_mask (or intr_simd_precise_mask / intr_pred_precise_mask).
In print_pmu_text(), the Intr registers output masks out the precise-only
subsets before printing Intr registers (precise sampling only):
print_probed_regs(fp, NULL, "Intr registers",
p->intr_regs_mask & ~p->intr_regs_precise_mask,
p->intr_regs_abi,
p->intr_simd_mask & ~p->intr_simd_precise_mask,
p->intr_pred_mask & ~p->intr_pred_precise_mask,
/*intr=*/true, /*json=*/false);
print_probed_regs(fp, NULL, "Intr registers (precise sampling only)",
p->intr_regs_precise_mask, p->intr_regs_abi,
p->intr_simd_precise_mask, p->intr_pred_precise_mask,
/*intr=*/true, /*json=*/false);
Should print_pmu_json() also mask out intr_regs_precise_mask,
intr_simd_precise_mask, and intr_pred_precise_mask when emitting
IntrRegisters, so that precise-only registers (such as x86 PEBS-only XMM
registers) are not duplicated in both IntrRegisters and
IntrRegistersPreciseOnly?
[ ... ]
> +static void add_pmu_display_name(struct strlist *list, const struct perf_pmu *pmu)
> +{
> + size_t num_inst = perf_pmu__num_duplicates(pmu);
> + char buf[128];
> +
> + if (!pmu->name)
> + return;
> + if (num_inst > 1) {
> + size_t base_len = pmu_name_len_no_suffix(pmu->name);
> +
> + snprintf(buf, sizeof(buf), "%.*s", (int)base_len, pmu->name);
> + strlist__add(list, buf);
> + } else {
> + strlist__add(list, pmu->name);
> + }
> +}
> +
> +static void print_system_summary(FILE *fp, const struct perf_session *session,
> + bool probed, bool leading_newline)
> +{
[ ... ]
> + while ((pmu = perf_pmus__scan_skip_duplicates(pmus, pmu)) != NULL) {
> + size_t pmu_events, sysfs_ev, json_ev;
> +
> + pmu_event_counts(pmu, &pmu_events, &sysfs_ev, &json_ev);
[ ... ]
> +int cmd_sysinfo(int argc, const char **argv)
> +{
[ ... ]
> + while ((pmu = show_all ? perf_pmus__scan(pmus, pmu) :
> + perf_pmus__scan_skip_duplicates(pmus, pmu)) != NULL) {
> + if (!pmu_matches_filters(pmu, show_all, argc, argv))
> + continue;
[Severity: Medium]
On heterogeneous or big.LITTLE systems where distinct core PMUs share a base
prefix before a decimal or 3+ hex-digit suffix (such as armv8_cortex_a53 and
armv8_cortex_a57/a72, or armv8_pmuv3_0 and armv8_pmuv3_1),
pmu_name_len_no_suffix() strips those suffixes and treats the core PMUs as
duplicates.
When running without -v or -a, won't perf_pmus__scan_skip_duplicates() in
cmd_sysinfo() and print_system_summary() skip all but the first core PMU,
while perf_pmu__num_duplicates() in print_pmu_text(), print_pmu_json(), and
add_pmu_display_name() strips the CPU suffix from the displayed core PMU name
(reporting armv8_cortex or armv8_pmuv3) and counts the system as having only
a single core PMU in the summary?
In addition, because evsel_matches_pmu() guards its prefix match with
!pmu->is_core, recorded events belonging to the skipped core PMUs will not
match the first core PMU either and will be omitted from Recorded events.
Should core PMUs be excluded from duplicate skipping and suffix stripping
(similar to how pmu_deduped_name_len() in tools/perf/util/pmu.c handles
pmu->is_core)?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103234502.1008382-1-irogers@google.com?part=39
next prev parent reply other threads:[~2026-11-04 7:50 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 23:44 [PATCH v1 00/41] perf: Per-env PMUs, recorded event metrics, and perf sysinfo Ian Rogers
2026-11-03 23:44 ` [PATCH v1 01/41] perf env: Make lazy perf_env initialization thread-safe Ian Rogers
2026-11-03 23:53 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 02/41] perf env: Add host_env() singleton Ian Rogers
2026-11-04 0:18 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 03/41] perf pmu: Add from_env parameter to perf_pmu__init() Ian Rogers
2026-11-04 0:31 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 04/41] perf pmus: Introduce struct perf_pmus and perf_env__pmus() Ian Rogers
2026-11-04 0:48 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 05/41] perf pmus: Pass struct perf_pmus to find helpers Ian Rogers
2026-11-04 0:56 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 06/41] perf pmus: Pass struct perf_pmus to scan helpers Ian Rogers
2026-11-04 1:01 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 07/41] perf pmu-events: Add e_machine to struct pmu_events_map Ian Rogers
2026-11-04 1:06 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 08/41] perf pmu-events: Pass e_machine to find_core_*_table() Ian Rogers
2026-11-04 1:14 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 09/41] perf header: Pass e_machine to strcmp_cpuid_str() Ian Rogers
2026-11-04 1:18 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 10/41] perf header: Support CPUID matching across all architectures Ian Rogers
2026-11-04 1:23 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 11/41] perf test: Make the CPUID matching test architecture independent Ian Rogers
2026-11-04 1:32 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 12/41] perf test: Add CPUID matching tests for other architectures Ian Rogers
2026-11-04 1:36 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 13/41] perf pmus: Add perf_pmus__read_from_env() Ian Rogers
2026-11-04 2:05 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 14/41] perf metricgroup: Pass struct perf_pmus to metricgroup__for_each_metric() Ian Rogers
2026-11-04 2:17 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 15/41] perf metricgroup: Move matching of metrics to recorded events from perf script Ian Rogers
2026-11-04 2:36 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 16/41] perf parse-events: Decode metric-id terms when adding events Ian Rogers
2026-11-04 2:44 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 17/41] perf evsel: Generalize metric_id to a set of metric_ids Ian Rogers
2026-11-04 3:17 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 18/41] perf pmu: Add perf_pmu__for_each_name_from_config() Ian Rogers
2026-11-04 3:23 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 19/41] perf metricgroup: Improve matching of metrics to recorded events Ian Rogers
2026-11-04 3:46 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 20/41] perf metricgroup: Add metricgroup__add_recorded_metrics() Ian Rogers
2026-11-04 4:10 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 21/41] perf script: Fix metrics computed from samples Ian Rogers
2026-11-04 4:16 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 22/41] perf script: Don't drop metric samples for CPUs missing from the evsel Ian Rogers
2026-11-04 4:22 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 23/41] perf stat report: Display metrics for recorded events Ian Rogers
2026-11-04 4:39 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 24/41] perf script: Display metrics for perf stat record data Ian Rogers
2026-11-04 4:47 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 25/41] perf test: Add stat record metrics test Ian Rogers
2026-11-04 5:01 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 26/41] perf pmus: Expose duplicate uncore PMU scanning helpers Ian Rogers
2026-11-04 5:08 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 27/41] perf mem-events: Expose PMU init and name formatting helpers Ian Rogers
2026-11-04 5:20 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 28/41] perf pmu: Add perf_pmu__probe() for basic open, counting, and sampling Ian Rogers
2026-11-04 5:39 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 29/41] perf pmu: Probe supported sample_type flags Ian Rogers
2026-11-04 5:49 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 30/41] perf pmu: Probe precise_ip levels Ian Rogers
2026-11-04 5:59 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 31/41] perf pmu: Probe privilege exclusion modifiers Ian Rogers
2026-11-04 6:04 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 32/41] perf pmu: Probe execution and AUX area features Ian Rogers
2026-11-04 6:19 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 33/41] perf pmu: Probe event group size limits Ian Rogers
2026-11-04 6:22 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 34/41] perf pmu: Probe user and interrupt sample register masks Ian Rogers
2026-11-04 6:44 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 35/41] perf pmu: Probe interrupt registers that require precise sampling Ian Rogers
2026-11-04 6:53 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 36/41] perf pmu: Probe memory profiling events and sample formats Ian Rogers
2026-11-04 7:04 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 37/41] perf pmu: Probe user-space mmap capabilities Ian Rogers
2026-11-04 7:27 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 38/41] perf pmu: Probe branch instruction skid Ian Rogers
2026-11-04 7:32 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 39/41] perf sysinfo: Add sysinfo subcommand Ian Rogers
2026-11-04 7:50 ` sashiko-bot [this message]
2026-11-03 23:44 ` [PATCH v1 40/41] perf docs: Add perf-sysinfo man page Ian Rogers
2026-11-04 7:51 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 41/41] perf test: Add perf sysinfo shell test Ian Rogers
2026-11-04 7:59 ` sashiko-bot
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=sashiko-outbox-196830@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=irogers@google.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox