Commit 9880835a authored by Oliver Upton's avatar Oliver Upton

KVM: arm64: vgic: Get rid of the LPI linked-list

All readers of LPI configuration have been transitioned to use the LPI
xarray. Get rid of the linked-list altogether.
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240221054253.3848076-6-oliver.upton@linux.devSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 2798683b
...@@ -53,7 +53,6 @@ void kvm_vgic_early_init(struct kvm *kvm) ...@@ -53,7 +53,6 @@ void kvm_vgic_early_init(struct kvm *kvm)
{ {
struct vgic_dist *dist = &kvm->arch.vgic; struct vgic_dist *dist = &kvm->arch.vgic;
INIT_LIST_HEAD(&dist->lpi_list_head);
INIT_LIST_HEAD(&dist->lpi_translation_cache); INIT_LIST_HEAD(&dist->lpi_translation_cache);
raw_spin_lock_init(&dist->lpi_list_lock); raw_spin_lock_init(&dist->lpi_list_lock);
xa_init_flags(&dist->lpi_xa, XA_FLAGS_LOCK_IRQ); xa_init_flags(&dist->lpi_xa, XA_FLAGS_LOCK_IRQ);
......
...@@ -58,7 +58,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, ...@@ -58,7 +58,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
INIT_LIST_HEAD(&irq->lpi_list);
INIT_LIST_HEAD(&irq->ap_list); INIT_LIST_HEAD(&irq->ap_list);
raw_spin_lock_init(&irq->irq_lock); raw_spin_lock_init(&irq->irq_lock);
...@@ -74,10 +73,8 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, ...@@ -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 * 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. * 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) { oldirq = xa_load(&dist->lpi_xa, intid);
if (oldirq->intid != intid) if (oldirq) {
continue;
/* Someone was faster with adding this LPI, lets use that. */ /* Someone was faster with adding this LPI, lets use that. */
kfree(irq); kfree(irq);
irq = oldirq; irq = oldirq;
...@@ -99,7 +96,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, ...@@ -99,7 +96,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
goto out_unlock; goto out_unlock;
} }
list_add_tail(&irq->lpi_list, &dist->lpi_list_head);
dist->lpi_list_count++; dist->lpi_list_count++;
out_unlock: out_unlock:
......
...@@ -122,7 +122,6 @@ void __vgic_put_lpi_locked(struct kvm *kvm, struct vgic_irq *irq) ...@@ -122,7 +122,6 @@ void __vgic_put_lpi_locked(struct kvm *kvm, struct vgic_irq *irq)
if (!kref_put(&irq->refcount, vgic_irq_release)) if (!kref_put(&irq->refcount, vgic_irq_release))
return; return;
list_del(&irq->lpi_list);
xa_erase(&dist->lpi_xa, irq->intid); xa_erase(&dist->lpi_xa, irq->intid);
dist->lpi_list_count--; dist->lpi_list_count--;
......
...@@ -117,7 +117,6 @@ struct irq_ops { ...@@ -117,7 +117,6 @@ struct irq_ops {
struct vgic_irq { struct vgic_irq {
raw_spinlock_t irq_lock; /* Protects the content of the struct */ 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 list_head ap_list;
struct kvm_vcpu *vcpu; /* SGIs and PPIs: The VCPU struct kvm_vcpu *vcpu; /* SGIs and PPIs: The VCPU
...@@ -277,7 +276,6 @@ struct vgic_dist { ...@@ -277,7 +276,6 @@ struct vgic_dist {
/* Protects the lpi_list and the count value below. */ /* Protects the lpi_list and the count value below. */
raw_spinlock_t lpi_list_lock; raw_spinlock_t lpi_list_lock;
struct xarray lpi_xa; struct xarray lpi_xa;
struct list_head lpi_list_head;
int lpi_list_count; int lpi_list_count;
/* LPI translation cache */ /* LPI translation cache */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment