All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Colton Lewis" <coltonlewis@google.com>
Cc: "Oliver Upton" <oupton@kernel.org>,
	kvmarm@lists.linux.dev, kvm@vger.kernel.org,
	"Marc Zyngier" <maz@kernel.org>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v9 05/22] perf: arm_pmuv3: Move counter allocation mask to per-CPU struct pmu_hw_events
Date: Thu, 24 Sep 2026 17:44:49 +0000	[thread overview]
Message-ID: <20260924174449.B3C661F0089C@smtp.kernel.org> (raw)
In-Reply-To: <20260924172928.2110956-6-coltonlewis@google.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] perf: arm_pmuv3: info leak of KVM guest counters to host userspace
- [Low] perf: arm_pmu: incomplete migration to per-CPU cntr_mask in cpu_pm_pmu_setup()
--

commit 44148c2c0e2e2ea859f2a156493d6c82c8cca8a9
Author: Colton Lewis <coltonlewis@google.com>

perf: arm_pmuv3: Move counter allocation mask to per-CPU struct pmu_hw_events

This commit introduces a per-CPU counter allocation mask (`cntr_mask`) to
prepare for dynamic PMU partitioning with KVM. It initializes the per-CPU
mask from the global mask and updates the allocation functions to use it.

> diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
> index 1150695653892..344adcd3521d0 100644
> --- a/drivers/perf/arm_pmu.c
> +++ b/drivers/perf/arm_pmu.c
[ ... ]
> @@ -717,6 +719,7 @@ bool arm_pmu_irq_is_nmi(void)
>  static int arm_perf_starting_cpu(unsigned int cpu, struct hlist_node *node)
>  {
>  	struct arm_pmu *pmu = hlist_entry_safe(node, struct arm_pmu, node);
> +	struct pmu_hw_events *cpuc = per_cpu_ptr(pmu->hw_events, cpu);
>  	int irq;
>  
>  	if (!cpumask_test_cpu(cpu, &pmu->supported_cpus))
> @@ -724,6 +727,8 @@ static int arm_perf_starting_cpu(unsigned int cpu, struct hlist_node *node)
>  	if (pmu->reset)
>  		pmu->reset(pmu);
>  
> +	bitmap_copy(cpuc->cntr_mask, pmu->cntr_mask, ARMPMU_MAX_HWEVENTS);
> +
>  	irq = armpmu_get_cpu_irq(pmu, cpu);
>  	if (irq)
>  		per_cpu(cpu_irq_ops, cpu)->enable_pmuirq(irq);

[Severity: Low]
Is there a missing update to cpu_pm_pmu_setup() in this file?

Looking at cpu_pm_pmu_setup(), it continues to use the global mask rather
than the newly introduced per-CPU mask:

drivers/perf/arm_pmu.c:cpu_pm_pmu_setup() {
    ...
	for_each_set_bit(idx, armpmu->cntr_mask, ARMPMU_MAX_HWEVENTS) {
		event = hw_events->events[idx];
		if (!event)
			continue;
    ...
}

While hw_events->events[idx] safely evaluates to NULL for counters
partitioned to KVM, should this loop be updated to iterate over
hw_events->cntr_mask for consistency with the new per-CPU abstractions
introduced here?

> diff --git a/drivers/perf/arm_pmuv3.c b/drivers/perf/arm_pmuv3.c
> index 4a6c1f3bcea1f..49289e5993dd7 100644
> --- a/drivers/perf/arm_pmuv3.c
> +++ b/drivers/perf/arm_pmuv3.c
[ ... ]
> @@ -813,7 +813,7 @@ static void armv8pmu_enable_user_access(struct arm_pmu *cpu_pmu)
>  		write_pmuacr(mask);
>  	} else {
>  		/* Clear any unused counters to avoid leaking their contents */
> -		for_each_andnot_bit(i, cpu_pmu->cntr_mask, cpuc->used_mask,
> +		for_each_andnot_bit(i, cpuc->cntr_mask, cpuc->used_mask,
>  				    ARMPMU_MAX_HWEVENTS) {
>  			if (i == ARMV8_PMU_CYCLE_IDX)
>  				write_pmccntr(0);

[Severity: High]
Does this change create an information leak across VM boundaries?

On pre-v3.9 hardware, armv8pmu_enable_user_access() enables EL0 counter
access globally. It clears unused counters to prevent leaking kernel state.
However, by changing the loop to iterate over the per-CPU cpuc->cntr_mask
instead of the global cpu_pmu->cntr_mask, counters reserved for KVM (which
are dynamically removed from cpuc->cntr_mask) will be skipped.

Since KVM does not zero hardware counters on vcpu_put, won't this allow
unprivileged host userspace to read the leftover guest counter values?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260924172928.2110956-1-coltonlewis@google.com?part=5

  reply	other threads:[~2026-09-24 17:44 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24 17:29 [PATCH v9 00/22] ARM64 PMU Partitioning Colton Lewis
2026-09-24 17:29 ` [PATCH v9 01/22] arm64: cpufeature: Add cpucap for HPMN0 Colton Lewis
2026-09-24 17:45   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 02/22] KVM: arm64: Reorganize PMU includes Colton Lewis
2026-09-24 17:38   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 03/22] KVM: arm64: Reorganize PMU functions Colton Lewis
2026-09-24 17:49   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 04/22] perf: arm_pmuv3: Generalize counter bitmasks Colton Lewis
2026-09-24 17:37   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 05/22] perf: arm_pmuv3: Move counter allocation mask to per-CPU struct pmu_hw_events Colton Lewis
2026-09-24 17:44   ` sashiko-bot [this message]
2026-09-24 17:29 ` [PATCH v9 06/22] perf: arm_pmuv3: Check cntr_mask before using pmccntr Colton Lewis
2026-09-24 17:38   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 07/22] perf: arm_pmuv3: Allocate counter indices from high to low Colton Lewis
2026-09-24 17:37   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 08/22] KVM: arm64: Add initial scaffolding for Partitioned PMU Colton Lewis
2026-09-24 17:44   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 09/22] KVM: arm64: Set up FGT " Colton Lewis
2026-09-24 17:52   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 10/22] KVM: arm64: Add Partitioned PMU register trap handlers Colton Lewis
2026-09-24 17:50   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 11/22] KVM: arm64: Set up MDCR_EL2 to handle a Partitioned PMU Colton Lewis
2026-09-24 17:53   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 12/22] KVM: arm64: Context swap Partitioned PMU guest registers Colton Lewis
2026-09-24 17:55   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 13/22] KVM: arm64: Enforce PMU event filter at vcpu_load() Colton Lewis
2026-09-24 17:47   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 14/22] perf: Add perf_pmu_resched_update() Colton Lewis
2026-09-24 17:46   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 15/22] KVM: arm64: Allow kvm_vcpu_pmu_resync_el0() to resync filters in process context Colton Lewis
2026-09-24 17:51   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 16/22] KVM: arm64: Apply dynamic guest counter reservations Colton Lewis
2026-09-24 17:57   ` sashiko-bot
2026-09-30 15:28   ` James Clark
2026-10-01 21:33     ` Colton Lewis
2026-09-24 17:29 ` [PATCH v9 17/22] KVM: arm64: Implement lazy PMU context swaps Colton Lewis
2026-09-24 17:55   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 18/22] perf: arm_pmuv3: Handle IRQs for Partitioned PMU guest counters Colton Lewis
2026-09-24 18:03   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 19/22] KVM: arm64: Detect overflows for the Partitioned PMU Colton Lewis
2026-09-24 18:07   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 20/22] KVM: arm64: Add vCPU device attr to partition the PMU Colton Lewis
2026-09-24 17:56   ` sashiko-bot
2026-09-30 15:27   ` James Clark
2026-10-01 21:21     ` Colton Lewis
2026-09-24 17:29 ` [PATCH v9 21/22] KVM: selftests: Add find_bit to KVM library Colton Lewis
2026-09-24 17:52   ` sashiko-bot
2026-09-24 17:29 ` [PATCH v9 22/22] KVM: arm64: selftests: Add test case for Partitioned PMU Colton Lewis
2026-09-24 17:55   ` sashiko-bot
2026-09-24 17:30 ` [PATCH] target/arm: Enable KVM PMU partitioning and counter limit Colton Lewis
2026-09-28 14:01   ` Peter Maydell
2026-09-29 21:21     ` Colton Lewis
2026-09-30 11:35       ` Peter Maydell
2026-10-01 21:34         ` Colton Lewis
2026-09-30 15:25 ` [PATCH v9 00/22] ARM64 PMU Partitioning James Clark
2026-10-01 21:33   ` Colton Lewis
2026-09-30 15:26 ` James Clark
2026-10-01 21:33   ` Colton Lewis

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=20260924174449.B3C661F0089C@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=coltonlewis@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=oupton@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.