]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: vgic-its: Get rid of the lpi_list_lock
authorOliver Upton <oliver.upton@linux.dev>
Mon, 22 Apr 2024 20:01:51 +0000 (20:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 25 Apr 2024 12:19:56 +0000 (13:19 +0100)
The last genuine use case for the lpi_list_lock was the global LPI
translation cache, which has been removed in favor of a per-ITS xarray.
Remove a layer from the locking puzzle by getting rid of it.

vgic_add_lpi() still has a critical section that needs to protect
against the insertion of other LPIs; change it to take the LPI xarray's
xa_lock to retain this property.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240422200158.2606761-13-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-init.c
arch/arm64/kvm/vgic/vgic-its.c
arch/arm64/kvm/vgic/vgic.c
include/kvm/arm_vgic.h

index 6ee42f3952536f97acddc2d3cf2968741d8d81aa..aee6083d0da63dd2bf8e467825b5d3bf5dc20cd6 100644 (file)
@@ -53,7 +53,6 @@ void kvm_vgic_early_init(struct kvm *kvm)
 {
        struct vgic_dist *dist = &kvm->arch.vgic;
 
-       raw_spin_lock_init(&dist->lpi_list_lock);
        xa_init_flags(&dist->lpi_xa, XA_FLAGS_LOCK_IRQ);
 }
 
index bb7f4fd35b2b8d91e36da3180027ca9e9f778b9f..40bb43f20bf34794204fb6c4008316b817770e9a 100644 (file)
@@ -69,7 +69,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
        irq->target_vcpu = vcpu;
        irq->group = 1;
 
-       raw_spin_lock_irqsave(&dist->lpi_list_lock, flags);
+       xa_lock_irqsave(&dist->lpi_xa, flags);
 
        /*
         * There could be a race with another vgic_add_lpi(), so we need to
@@ -84,14 +84,14 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
                goto out_unlock;
        }
 
-       ret = xa_err(xa_store(&dist->lpi_xa, intid, irq, 0));
+       ret = xa_err(__xa_store(&dist->lpi_xa, intid, irq, 0));
        if (ret) {
                xa_release(&dist->lpi_xa, intid);
                kfree(irq);
        }
 
 out_unlock:
-       raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags);
+       xa_unlock_irqrestore(&dist->lpi_xa, flags);
 
        if (ret)
                return ERR_PTR(ret);
index e3ee1bc1214af40b4c390c6470a6f45cfc9d9c36..d0c59b51a6b0946101697a8f51f6b4c2a5bc02c7 100644 (file)
@@ -29,9 +29,8 @@ struct vgic_global kvm_vgic_global_state __ro_after_init = {
  *       its->cmd_lock (mutex)
  *         its->its_lock (mutex)
  *           vgic_cpu->ap_list_lock            must be taken with IRQs disabled
- *             kvm->lpi_list_lock              must be taken with IRQs disabled
- *               vgic_dist->lpi_xa.xa_lock     must be taken with IRQs disabled
- *                 vgic_irq->irq_lock          must be taken with IRQs disabled
+ *             vgic_dist->lpi_xa.xa_lock       must be taken with IRQs disabled
+ *               vgic_irq->irq_lock            must be taken with IRQs disabled
  *
  * As the ap_list_lock might be taken from the timer interrupt handler,
  * we have to disable IRQs before taking this lock and everything lower
index 76ed097500c04f3b600fc884388a7677dd2d30a4..50b828b278fd00002268edd4d76153d74ae4e0ed 100644 (file)
@@ -280,9 +280,6 @@ struct vgic_dist {
         */
        u64                     propbaser;
 
-       /* Protects the lpi_list. */
-       raw_spinlock_t          lpi_list_lock;
-
 #define LPI_XA_MARK_DEBUG_ITER XA_MARK_0
        struct xarray           lpi_xa;