From: sashiko-bot@kernel.org
To: Johnny.Fan <johnny.fan@cixtech.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH] perf: arm_spe: Support heterogeneous ACPI systems
Date: Thu, 15 Oct 2026 06:42:17 +0000 [thread overview]
Message-ID: <sashiko-outbox-172355@kernel.org> (raw)
In-Reply-To: <20261015062908.3565761-1-johnny.fan@cixtech.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] perf: arm_spe: missing heterogeneity check for optional PMUs
- [Medium] perf/arm_spe: spurious probe failure due to CPU hotplug race
--
commit 9ac6f1b22e8955b2543af029311236c9a14923ec
Author: Johnny.Fan <Johnny.Fan@cixtech.com>
perf: arm_spe: Support heterogeneous ACPI systems
The ACPI MADT describes the SPE overflow interrupt on a per-CPU basis
in the GICC structure, where a CPU that does not implement SPE simply
reports 0. Heterogeneous systems therefore only report the interrupt
on the CPUs that implement SPE, but arm_pmu_acpi.c rejects this as a
non-homogeneous mapping and never creates the SPE platform device.
> diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
> index ca6bf8f86cfe9..4ece1070827b9 100644
> --- a/drivers/perf/arm_pmu_acpi.c
> +++ b/drivers/perf/arm_pmu_acpi.c
[ ... ]
> @@ -97,6 +100,20 @@ arm_acpi_register_pmu_device(struct platform_device *pdev, u8 len,
> return gsi ? -ENXIO : 0;
>
> this_gsi = parse_gsi(gicc);
> +
> + if (optional) {
> + if (!this_gsi)
> + continue;
> +
> + if (gsi && gsi != this_gsi) {
> + pr_warn("ACPI: %s: CPU%d: inconsistent interrupt %u/%u\n",
> + pdev->name, cpu, gsi, this_gsi);
> + return -ENXIO;
> + }
> + gsi = this_gsi;
> + continue;
> + }
> +
> this_hetid = find_acpi_cpu_topology_hetero_id(cpu);
> if (!gsi) {
> hetid = this_hetid;
[Severity: High]
Does skipping find_acpi_cpu_topology_hetero_id() allow grouping CPUs from
different microarchitectural clusters into a single PMU device?
The SPE PMU driver (arm_spe_pmu_dev_init()) assumes a single PMU device is
homogeneous. It probes SPE parameters (e.g., align, max_record_sz, features)
on a single CPU via smp_call_function_any() and applies them to all CPUs in
spe_pmu->supported_cpus.
If heterogeneous CPUs with different SPE capabilities are grouped together,
scheduling a perf event on a CPU from a different cluster could program the
hardware with mismatched constraints or feature flags. Could the this_hetid
check be preserved for the CPUs that actually implement the optional PMU?
> diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c
> index 604ae6ba3b076..c1ff875be9577 100644
> --- a/drivers/perf/arm_spe_pmu.c
> +++ b/drivers/perf/arm_spe_pmu.c
[ ... ]
> @@ -1277,6 +1291,12 @@ static int arm_spe_pmu_cpu_startup(unsigned int cpu, struct hlist_node *node)
> if (!cpumask_test_cpu(cpu, &spe_pmu->supported_cpus))
> return 0;
>
> + /* The CPU was offline during probe; trim it if it lacks SPE */
> + if (!arm_spe_pmu_pmsver()) {
> + cpumask_clear_cpu(cpu, &spe_pmu->supported_cpus);
> + return 0;
> + }
> +
> __arm_spe_pmu_setup_one(spe_pmu);
[Severity: High]
Is it possible for the newly online CPU to have a different version of SPE
than what was cached during the initial probe?
This startup check only verifies that the CPU has some version of SPE
(checking pmsver != 0), but does not verify that the SPE parameters match
the ones cached from the initial probe.
[ ... ]
> @@ -1346,6 +1366,21 @@ static int arm_spe_pmu_irq_probe(struct arm_spe_pmu *spe_pmu)
>
> cpumask_copy(&spe_pmu->supported_cpus, affinity);
>
> + /*
> + * Heterogeneous systems may only implement SPE on a subset of the
> + * CPUs covered by the interrupt affinity (ACPI in particular has
> + * no affinity information and falls back to cpu_possible_mask).
> + * SPE is self-describing through PMSVer, so drop the online CPUs
> + * that do not implement it. CPUs that are offline at probe time
> + * are checked when they come up.
> + */
> + for_each_cpu(cpu, &spe_pmu->supported_cpus) {
> + if (cpu_online(cpu))
> + smp_call_function_single(cpu,
> + __arm_spe_pmu_trim_supported_cpus,
> + spe_pmu, 1);
> + }
> +
> spe_pmu->irq = irq;
> return 0;
> }
[Severity: Medium]
Could this cpu_online(cpu) check without holding cpus_read_lock() lead to a
race condition with CPU hotplug?
If an offline CPU lacking SPE comes online immediately after this loop, it
could remain in supported_cpus because the hotplug callback is not yet
registered.
Later, arm_spe_pmu_dev_init() consumes this mask:
ret = smp_call_function_any(mask, __arm_spe_pmu_dev_probe, spe_pmu, 1);
if (ret || !(spe_pmu->features & SPE_PMU_FEAT_DEV_PROBED))
return -ENXIO;
This could select the newly online CPU that lacks SPE, causing the driver
probe to spuriously fail.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261015062908.3565761-1-johnny.fan@cixtech.com?part=1
next prev parent reply other threads:[~2026-10-15 6:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 6:29 [PATCH] perf: arm_spe: Support heterogeneous ACPI systems Johnny.Fan
2026-10-15 6:42 ` sashiko-bot [this message]
2026-10-15 10:49 ` Marc Zyngier
2026-10-15 11:52 ` Johnny Fan
2026-10-15 15:58 ` Jeremy Linton
2026-10-15 14:19 ` Leo Yan
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-172355@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=johnny.fan@cixtech.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 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.