KVM: arm64: vgic: Get rid of the LPI linked-list
authorOliver Upton <oliver.upton@linux.dev>
Wed, 21 Feb 2024 05:42:48 +0000 (05:42 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Fri, 23 Feb 2024 21:46:02 +0000 (21:46 +0000)
All readers of LPI configuration have been transitioned to use the LPI
xarray. Get rid of the linked-list altogether.

Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240221054253.3848076-6-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
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 411719053107923c37ed4d18df40e36d98a70731..e25672d6e846f7f98530cdf1d1ff8e9190bd54e4 100644 (file)
@@ -53,7 +53,6 @@ void kvm_vgic_early_init(struct kvm *kvm)
 {
        struct vgic_dist *dist = &kvm->arch.vgic;
 
-       INIT_LIST_HEAD(&dist->lpi_list_head);
        INIT_LIST_HEAD(&dist->lpi_translation_cache);
        raw_spin_lock_init(&dist->lpi_list_lock);
        xa_init_flags(&dist->lpi_xa, XA_FLAGS_LOCK_IRQ);
index b9874dc046088572498141686767880f5f46c8c5..3d0208162bcdac11d075633ad392d0c1542c304a 100644 (file)
@@ -58,7 +58,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
                return ERR_PTR(ret);
        }
 
-       INIT_LIST_HEAD(&irq->lpi_list);
        INIT_LIST_HEAD(&irq->ap_list);
        raw_spin_lock_init(&irq->irq_lock);
 
@@ -74,10 +73,8 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
         * There could be a race with another vgic_add_lpi(), so we need to
         * check that we don't add a second list entry with the same LPI.
         */
-       list_for_each_entry(oldirq, &dist->lpi_list_head, lpi_list) {
-               if (oldirq->intid != intid)
-                       continue;
-
+       oldirq = xa_load(&dist->lpi_xa, intid);
+       if (oldirq) {
                /* Someone was faster with adding this LPI, lets use that. */
                kfree(irq);
                irq = oldirq;
@@ -99,7 +96,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
                goto out_unlock;
        }
 
-       list_add_tail(&irq->lpi_list, &dist->lpi_list_head);
        dist->lpi_list_count++;
 
 out_unlock:
index 7d17dbc8f5dcaaa23c41f5c53e9714d394015b15..6240faab0127025472adddefc0abbe7be6e2be3e 100644 (file)
@@ -122,7 +122,6 @@ void __vgic_put_lpi_locked(struct kvm *kvm, struct vgic_irq *irq)
        if (!kref_put(&irq->refcount, vgic_irq_release))
                return;
 
-       list_del(&irq->lpi_list);
        xa_erase(&dist->lpi_xa, irq->intid);
        dist->lpi_list_count--;
 
index 795b35656b54df715f23c507a4231ea014c746fa..aeff363e3ba6019efb44c09ad735aabb54d21129 100644 (file)
@@ -117,7 +117,6 @@ struct irq_ops {
 
 struct vgic_irq {
        raw_spinlock_t irq_lock;        /* Protects the content of the struct */
-       struct list_head lpi_list;      /* Used to link all LPIs together */
        struct list_head ap_list;
 
        struct kvm_vcpu *vcpu;          /* SGIs and PPIs: The VCPU
@@ -277,7 +276,6 @@ struct vgic_dist {
        /* Protects the lpi_list and the count value below. */
        raw_spinlock_t          lpi_list_lock;
        struct xarray           lpi_xa;
-       struct list_head        lpi_list_head;
        int                     lpi_list_count;
 
        /* LPI translation cache */