KVM: arm64: vgic: Don't check for vgic_ready() when setting NR_IRQS
authorOliver Upton <oliver.upton@linux.dev>
Thu, 17 Oct 2024 00:19:46 +0000 (00:19 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 17 Oct 2024 08:20:48 +0000 (09:20 +0100)
KVM commits to a particular sizing of SPIs when the vgic is initialized,
which is before the point a vgic becomes ready. On top of that, KVM
supplies a default amount of SPIs should userspace not explicitly
configure this.

As such, the check for vgic_ready() in the handling of
KVM_DEV_ARM_VGIC_GRP_NR_IRQS is completely wrong, and testing if nr_spis
is nonzero is sufficient for preventing userspace from playing games
with us.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20241017001947.2707312-2-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-kvm-device.c

index 1d26bb5..5f4f57a 100644 (file)
@@ -236,7 +236,12 @@ static int vgic_set_common_attr(struct kvm_device *dev,
 
                mutex_lock(&dev->kvm->arch.config_lock);
 
-               if (vgic_ready(dev->kvm) || dev->kvm->arch.vgic.nr_spis)
+               /*
+                * Either userspace has already configured NR_IRQS or
+                * the vgic has already been initialized and vgic_init()
+                * supplied a default amount of SPIs.
+                */
+               if (dev->kvm->arch.vgic.nr_spis)
                        ret = -EBUSY;
                else
                        dev->kvm->arch.vgic.nr_spis =