Re: [PATCH 13/15] KVM: x86/pmu: Ignore AnyThread bit if CPUID.0AH:EDX[15] is not set

"Chen, Zide" <[email protected]> Mon, 3 Aug 2026 16:32:38 -0500
Newsgroups org.kernel.vger.kvm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

On 7/7/2026 1:34 PM, Zide Chen wrote:
> Intel PerfMon v5 introduces the ANYTHREAD_DEPRECATION capability
> (CPUID.0AH:EDX[15]) to indicate that AnyThread counting is deprecated
> and that writes to the AnyThread bit in IA32_PERFEVTSELx are ignored.
> 
> When ANYTHREAD_DEPRECATION is present in the guest CPUID, emulate the
> architectural behavior and silently ignore writes to the AnyThread bit
> instead of injecting #GP.
> 
> Continue to inject #GP when ANYTHREAD_DEPRECATION is not present in the
> guest CPUID, e.g. for PerfMon v3/v4 guests or when the capability is
> not configured for a PerfMon v5+ guest.

Advertise CPUID.0AH:EDX[15] only for PMU version 5+ guests, since the
bit doesn't exist below version 5.

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 7fa5d6d51fe9..2dcce8119f1c 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -1542,7 +1542,7 @@ static inline int __do_cpuid_func(struct
kvm_cpuid_array *array, u32 function)
                                            KVM_MAX_NR_FIXED_COUNTERS);
                edx.split.bit_width_fixed = kvm_pmu_cap.bit_width_fixed;

-               if (kvm_pmu_cap.version)
+               if (kvm_pmu_cap.version >= 5)
                        edx.split.anythread_deprecated = 1;

                entry->eax = eax.full;

> Signed-off-by: Zide Chen <[email protected]>
> ---
>  arch/x86/kvm/vmx/pmu_intel.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
> index 3f41e4916986..2c2a54ac55ad 100644
> --- a/arch/x86/kvm/vmx/pmu_intel.c
> +++ b/arch/x86/kvm/vmx/pmu_intel.c
> @@ -508,6 +508,11 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>  			if (data & eventsel_rsvd)
>  				return 1;
>  
> +			/*
> +			 * On PerfMon v5+, KVM may allow writes to the AnyThread
> +			 * bit and silently discard them.
> +			 */
> +			data &= ~ARCH_PERFMON_EVENTSEL_ANY;
>  			if (data != pmc->eventsel) {
>  				pmc->eventsel = data;
>  				pmc->eventsel_hw = data;
> @@ -627,6 +632,9 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
>  	pmu->all_valid_pmc_mask64 = (BIT_ULL(nr_gp_counters) - 1) &
>  				    kvm_pmu_cap.cntr_mask64;
>  
> +	if (pmu->version >= 5 && edx.split.anythread_deprecated)
> +		pmu->eventsel_rsvd &= ~ARCH_PERFMON_EVENTSEL_ANY;
> +
>  	entry = kvm_find_cpuid_entry_index(vcpu, 7, 0);
>  	if (entry &&
>  	    (boot_cpu_has(X86_FEATURE_HLE) || boot_cpu_has(X86_FEATURE_RTM)) &&