Re: [PATCH v7 2/9] KVM: x86/pmu: Support Intel fixed counter 3 on mediated vPMU

"Chen, Zide" <[email protected]>
Newsgroups dev.linux.lists.sashiko-reviews,org.kernel.vger.kvm
Message-ID <[email protected]>

On 7/27/2026 2:51 PM, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] The logic to filter non-contiguous fixed counters incorrectly uses CPUID.0A:EDX[4:0] instead of counting the contiguous 1-bits in the ECX bitmask. This causes KVM to expose non-existent fixed counters to the guest while hiding supported ones.
> --
> 
> --- Patch [2]: [PATCH v7 2/9] KVM: x86/pmu: Support Intel fixed counter 3 on mediated vPMU ---
> commit 7c8d5061e2216416ace2a9414a66d8b5fc0bf8bd
> Author: Dapeng Mi <[email protected]>
> 
> KVM: x86/pmu: Support Intel fixed counter 3 on mediated vPMU
> 
> This commit exposes Intel's fixed counter 3 to guests when mediated vPMU is
> enabled. It updates the maximum number of fixed counters and adds logic to
> filter non-contiguous fixed counters since KVM currently does not support
> them.
> 
>> diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
>> --- a/arch/x86/kvm/pmu.c
>> +++ b/arch/x86/kvm/pmu.c
> [ ... ]
>> @@ -181,6 +185,19 @@ void kvm_init_pmu_capability(struct kvm_pmu_ops *pmu_ops)
>>  	kvm_pmu_cap.num_counters_fixed = min(kvm_pmu_cap.num_counters_fixed,
>>  					     KVM_MAX_NR_FIXED_COUNTERS);
>>  
>> +	/*
>> +	 * Currently, KVM doesn't support non-contiguous fixed counters; make
>> +	 * sure only contiguous ones are retained in kvm_pmu_cap.
>> +	 */
>> +	if (kvm_host_pmu.version >= 5) {
>> +		cpuid(0xa, &eax, &ebx, &ecx, &edx.full);
>> +		if (kvm_pmu_cap.num_counters_fixed > edx.split.num_counters_fixed)
>> +			kvm_pmu_cap.num_counters_fixed = edx.split.num_counters_fixed;
> 
> [Severity: High]
> Does this logic correctly determine the number of contiguous fixed counters?
> 
> If a host supports PMU version 5 with fixed counters 0, 1, and 3, the ecx
> bitmask would be 0xB, and kvm_pmu_cap.num_counters_fixed would initially be
> populated with the weight of that mask, which is 3.
> 
> The value in edx.split.num_counters_fixed reports the maximum fixed counter
> index plus one (4 in this scenario). The condition 3 > 4 evaluates to
> false, so kvm_pmu_cap.num_counters_fixed remains 3.

I think it's a false positive.

edx.split.num_counters_fixed represents the number of contiguous fixed
counters, which is 2 in this case. The code correctly sets
kvm_pmu_cap.num_counters_fixed to 2.

> This leaves KVM exposing the first three contiguous counters (0, 1, and 2)
> to the guest. Since the host hardware does not actually support counter 2,
> KVMs attempt to back it with a host perf event will fail.
> 
> Should this instead inspect the contiguous 1-bits starting from bit 0 in the
> ecx bitmask, for example by using ffz(~ecx)?
> 
>> +	}
>> +
>> +	if (!enable_mediated_pmu && kvm_pmu_cap.num_counters_fixed > 3)
>> +		kvm_pmu_cap.num_counters_fixed = 3;
>> +
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.