Re: [PATCH v2 4/4] perf/x86: KVM: Have perf define a dedicated struct for getting guest PEBS data

From: Sean Christopherson

Date: Wed May 06 2026 - 10:05:10 EST


On Mon, May 04, 2026, Jim Mattson wrote:
> On Mon, May 4, 2026 at 10:19 AM Sean Christopherson <seanjc@xxxxxxxxxx> wrote:
> >
> > On Fri, May 01, 2026, Jim Mattson wrote:
> > > > @@ -5052,7 +5051,7 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data)
> > > > * wrong counter(s). Similarly, disallow PEBS in the guest if the host
> > > > * is using PEBS, to avoid bleeding host state into PEBS records.
> > > > */
> > > > - guest_pebs_mask &= kvm_pmu->pebs_enable & ~kvm_pmu->host_cross_mapped_mask;
> > > > + guest_pebs_mask &= guest_pebs->enable & ~guest_pebs->cross_mapped_mask;
> > >
> > > It would be helpful to save this mask somewhere, so that it can be
> > > used when calculating guest_pebs_idxs in x86_pmu_handle_guest_pebs().
> > > I think that code needs a fix similar to the one in commit
> > > 58f6217e5d01 ("perf/x86/intel: KVM: Mask PEBS_ENABLE loaded for guest
> > > with vCPU's value.").
> >
> > Blech. This all feels like a losing game of whack-a-mole. Proxying the PMU
> > through perf is a mediocre approximation for non-PEBS events, and it seems like
> > it's downright awful for PEBS. Ideally, we'd just rip out all of the perf-based
> > PEBS virtualization support, and only support PEBS through the mediated PMU. :-/
> >
> > Absent drastic measures though, saving the effective guest_pebs_enable in the
> > per-CPU tracking does seem like the least awful approach. Though I don't quite
> > understand why we can't use GLOBAL_STATUS for x86_pmu_handle_guest_pebs(). I.e.
> > what happens if x86_pmu_handle_guest_pebs() only processes counters that actually
> > got marked as overflowing?
>
> x86_pmu_handle_guest_pebs() is called in the path where we are
> handling GLOBAL_STATUS bit 62 (GLOBAL_STATUS_BUFFER_OVF_BIT).
> Individual PEBS PMCs are not configured to raise PMI on overflow.

Right, but aren't the per-counter OVF bits still set in GLOBAL_STATUS? Ah, no,
at least that's not supposed to happen, per commit 8077eca079a2 ("perf/x86/pebs:
Add workaround for broken OVFL status on HSW+"). Well that's lame.