Re: [PATCH 1/4] perf/x86/intel: Don't write PEBS_ENABLED on host<=>guest xfers if CPU has isolation
From: Sean Christopherson
Date: Thu Apr 16 2026 - 15:52:27 EST
On Thu, Apr 16, 2026, Namhyung Kim wrote:
> > + /*
> > + * Disable counters where the guest PMC is different than the host PMC
> > + * being used on behalf of the guest, as the PEBS record includes
> > + * PERF_GLOBAL_STATUS, i.e. the guest will see overflow status for the
> > + * 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;
> > + if (pebs_mask & ~cpuc->intel_ctrl_guest_mask)
> > + guest_pebs_mask = 0;
> >
> > + /*
> > + * Do NOT mess with PEBS_ENABLED. As above, disabling counters via
> > + * PERF_GLOBAL_CTRL is sufficient, and loading a stale PEBS_ENABLED,
> > + * e.g. on VM-Exit, can put the system in a bad state. Simply enable
> > + * counters in PERF_GLOBAL_CTRL, as perf load PEBS_ENABLED with the
> > + * full value, i.e. perf *also* relies on PERF_GLOBAL_CTRL.
> > + */
> > + arr[global_ctrl].guest |= guest_pebs_mask;
>
> I was confused by the earlier comment in the funcion that says it is not
> enough to disable counters but I've realized it's only for the case PEBS
> isolation is not supported by CPU/ucode.
Yeah, me too, more than once. :-/
> I think it's ok for disabling guest PEBS, but I'm curious if there's a
> case to enable PEBS only in guest and it'd be handled correctly.
Yep, if PEBS is being virtualized for the guest, unless the host is also profiling,
then PEBS will be active for the guest but not the host. KVM tests for PEBS pass,
and while they aren't exactly comprehensive, they should detect outright breakage.