]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: vgic: Explicitly implement vgic_dist::ready ordering
authorKeir Fraser <keirf@google.com>
Tue, 9 Sep 2025 10:00:05 +0000 (10:00 +0000)
committerMarc Zyngier <maz@kernel.org>
Mon, 15 Sep 2025 09:55:22 +0000 (10:55 +0100)
In preparation to remove synchronize_srcu() from MMIO registration,
remove the distributor's dependency on this implicit barrier by
direct acquire-release synchronization on the flag write and its
lock-free check.

Signed-off-by: Keir Fraser <keirf@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-init.c

index 3f207b5f80a5720da1b07d3533eb4462b7c38849..ccccb5c04ac1bd307c21c27ac982ae0b5f890489 100644 (file)
@@ -562,7 +562,7 @@ int kvm_vgic_map_resources(struct kvm *kvm)
        gpa_t dist_base;
        int ret = 0;
 
-       if (likely(dist->ready))
+       if (likely(smp_load_acquire(&dist->ready)))
                return 0;
 
        mutex_lock(&kvm->slots_lock);
@@ -593,14 +593,7 @@ int kvm_vgic_map_resources(struct kvm *kvm)
                goto out_slots;
        }
 
-       /*
-        * kvm_io_bus_register_dev() guarantees all readers see the new MMIO
-        * registration before returning through synchronize_srcu(), which also
-        * implies a full memory barrier. As such, marking the distributor as
-        * 'ready' here is guaranteed to be ordered after all vCPUs having seen
-        * a completely configured distributor.
-        */
-       dist->ready = true;
+       smp_store_release(&dist->ready, true);
        goto out_slots;
 out:
        mutex_unlock(&kvm->arch.config_lock);