Re: [PATCH v6 7/8] KVM: x86/pmu: Emulate RDPMC on performance metrics
From: Jim Mattson
Date: Wed Jul 22 2026 - 20:14:09 EST
On Mon, Jun 29, 2026 at 4:29 PM Zide Chen <zide.chen@xxxxxxxxx> wrote:
>
> If the host has the PERF_METRICS capability but it's not present on
> the guest, RDPMC interception must be enabled and KVM should inject
> an #GP when the guest attempts a PERF_METRICS RDPMC.
>
> If the guest has PERF_METRICS but RDPMC interception is enabled for
> other reasons, KVM needs to emulate RDPMC with type 2000H.
>
> For simplicity, Metrics Clear Mode is not supported.
>
> Signed-off-by: Zide Chen <zide.chen@xxxxxxxxx>
> ---
> v6:
> - Merge kvm_pmu_rdpmc_metrics() into intel_emulate_rdpmc().
> - Reject non-zero index.
> v5:
> - new patch.
> ---
> arch/x86/kvm/pmu.c | 7 +++++++
> arch/x86/kvm/vmx/pmu_intel.c | 14 ++++++++++++++
> 2 files changed, 21 insertions(+)
>
> diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
> index 8ef2d4761790..04b9c840f218 100644
> --- a/arch/x86/kvm/pmu.c
> +++ b/arch/x86/kvm/pmu.c
> @@ -806,6 +806,12 @@ bool kvm_need_perf_global_ctrl_intercept(struct kvm_vcpu *vcpu)
> }
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_need_perf_global_ctrl_intercept);
>
> +static bool kvm_need_perf_metrics_intercept(struct kvm_vcpu *vcpu)
> +{
> + return (kvm_host.perf_capabilities & PERF_CAP_PERF_METRICS) &&
> + !kvm_vcpu_has_perf_metrics(vcpu);
> +}
> +
> bool kvm_need_rdpmc_intercept(struct kvm_vcpu *vcpu)
> {
> struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
> @@ -818,6 +824,7 @@ bool kvm_need_rdpmc_intercept(struct kvm_vcpu *vcpu)
> return true;
I know we have a strong disagreement here, but I really feel that this
must be secure and future-proof out of the box.
What if we added a module parameter, enable_rdpmc_passthrough, which
defaults to false?
Then:
if (!enable_rdpmc_passthrough)
return true;
Is that a reasonable compromise?
> return kvm_need_any_pmc_intercept(vcpu) ||
> + kvm_need_perf_metrics_intercept(vcpu) ||
> pmu->counter_bitmask[KVM_PMC_GP] != (BIT_ULL(kvm_host_pmu.bit_width_gp) - 1) ||
> pmu->counter_bitmask[KVM_PMC_FIXED] != (BIT_ULL(kvm_host_pmu.bit_width_fixed) - 1);
> }