]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Finalize ID registers only once per VM
authorMarc Zyngier <maz@kernel.org>
Mon, 10 Nov 2025 17:30:10 +0000 (17:30 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 11 Nov 2025 12:24:22 +0000 (12:24 +0000)
Owing to the ID registers being global to the VM, there is no point
in computing them more than once.  However, recent changes making
use of kvm_set_vm_id_reg() outlined that we repeatedly hammer
the ID registers when we shouldn't.

Gate the ID reg update on the VM having never run.

Fixes: 50e7cce81b9b2 ("KVM: arm64: Limit clearing of ID_{AA64PFR0,PFR1}_EL1.GIC to userspace irqchip")
Fixes: 5cb57a1aff755 ("KVM: arm64: Zero ID_AA64PFR0_EL1.GIC when no GICv3 is presented to the guest")
Closes: https://lore.kernel.org/r/aRHf6x5umkTYhYJ3@finisterre.sirena.org.uk
Reported-by: Mark Brown <broonie@kernel.org>
Tested-by: Mark Brown <broonie@kernel.org>
Link: https://patch.msgid.link/20251110173010.1918424-1-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/sys_regs.c

index 8ae2bca81614861ed00efff6d5320bb061857acd..ec3fbe0b8d525bdc8ab8782526e109f7be518edd 100644 (file)
@@ -5609,7 +5609,11 @@ int kvm_finalize_sys_regs(struct kvm_vcpu *vcpu)
 
        guard(mutex)(&kvm->arch.config_lock);
 
-       if (!irqchip_in_kernel(kvm)) {
+       /*
+        * This hacks into the ID registers, so only perform it when the
+        * first vcpu runs, or the kvm_set_vm_id_reg() helper will scream.
+        */
+       if (!irqchip_in_kernel(kvm) && !kvm_vm_has_ran_once(kvm)) {
                u64 val;
 
                val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1) & ~ID_AA64PFR0_EL1_GIC;