]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: vgic-v5: Correctly set dist->ready once initialised
authorMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 10:36:05 +0000 (11:36 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 14:42:26 +0000 (15:42 +0100)
kvm_vgic_map_resources() targetting a v5 model results in vgic->dist_ready
never being set. This doesn't result in anything really bad, only
some more heavy locking as we go and re-init something for no good reason.

Rejig the code to correctly set the ready flag in all non-failing
cases.

Reviewed-by: Sascha Bischoff <sascha.bischoff@arm.com>
Fixes: f4d37c7c35769 ("KVM: arm64: gic-v5: Create and initialise vgic_v5")
Link: https://sashiko.dev/#/patchset/20260319154937.3619520-1-sascha.bischoff%40arm.com
Link: https://patch.msgid.link/20260401103611.357092-11-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-init.c

index 34460179fb8ae157e314a365976f28b4f9cc6c1b..2859dad46a931000b9a6f7095f710c6ade05fd3c 100644 (file)
@@ -657,16 +657,20 @@ int kvm_vgic_map_resources(struct kvm *kvm)
                needs_dist = false;
        }
 
-       if (ret || !needs_dist)
+       if (ret)
                goto out;
 
-       dist_base = dist->vgic_dist_base;
-       mutex_unlock(&kvm->arch.config_lock);
+       if (needs_dist) {
+               dist_base = dist->vgic_dist_base;
+               mutex_unlock(&kvm->arch.config_lock);
 
-       ret = vgic_register_dist_iodev(kvm, dist_base, type);
-       if (ret) {
-               kvm_err("Unable to register VGIC dist MMIO regions\n");
-               goto out_slots;
+               ret = vgic_register_dist_iodev(kvm, dist_base, type);
+               if (ret) {
+                       kvm_err("Unable to register VGIC dist MMIO regions\n");
+                       goto out_slots;
+               }
+       } else {
+               mutex_unlock(&kvm->arch.config_lock);
        }
 
        smp_store_release(&dist->ready, true);