[PATCH v8 09/11] KVM: arm64: PMU: Implement fixed-counters-only emulation

Akihiko Odaki odaki at rsg.ci.i.u-tokyo.ac.jp
Mon Jul 13 14:50:33 PDT 2026


On 2026/07/13 16:41, Oliver Upton wrote:
> On Fri, Jul 10, 2026 at 08:15:03PM +0900, Akihiko Odaki wrote:
>> @@ -813,6 +842,15 @@ void kvm_host_pmu_init(struct arm_pmu *pmu)
>>   	if (!pmuv3_implemented(kvm_arm_pmu_get_pmuver_limit()))
>>   		return;
>>   
>> +	/*
>> +	 * IMPDEF PMUv3 traps are non-architectural, and KVM cannot assume a
>> +	 * uniform PMUv3-compatible arm_pmu is available on all CPUs.
>> +	 */
>> +	if (cpus_have_final_cap(ARM64_WORKAROUND_PMUV3_IMPDEF_TRAPS)) {
>> +		kvm_info("Non-architectural PMU, tainting kernel\n");
>> +		add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
>> +	}
>> +
> 
> This is an unrelated change, and really the taint should be added with the
> .cpu_enable() for this capability. That's the point where we flip the
> magic bit.

I'm abandoning this change because it does not effectively cover all 
corner cases we don't want to support:
https://lore.kernel.org/all/0e5e64ea-2f3c-4ce6-88ac-08b66f13027c@rsg.ci.i.u-tokyo.ac.jp/

> 
>> +void kvm_vcpu_load_pmu(struct kvm_vcpu *vcpu, int last_cpu)
>> +{
>> +	if (!kvm_pmu_fixed_counters_only(vcpu->kvm) || vcpu->cpu == last_cpu || last_cpu == -1)
> 										^~~~~~~~~~~~~~
> 
> Does this do anything other than avoid a spurious reload on the first KVM_RUN?

Yes. Without this check, the value will be passed to cpu_max_bits_warn() 
in the following call chain, resulting in a warning ifdef 
CONFIG_DEBUG_PER_CPU_MAPS:

1. kvm_vcpu_load_pmu()
2. kvm_pmu_probe_armpmu()
3. cpumask_test_cpu()
4. cpumask_check()
5. cpu_max_bits_warn()

Regards,
Akihiko Odaki



More information about the linux-arm-kernel mailing list