Re: [PATCH 05/15] KVM: arm64: vgic: Get rid of the LPI linked-list

Marc Zyngier
2024-01-25T09:28:30Z

On Wed, 24 Jan 2024 20:48:59 +0000,
Oliver Upton <oliver.upton@linux.dev> wrote:
>
> All readers of LPI configuration have been transitioned to use the LPI
> xarray. Get rid of the linked-list altogether.
>
> Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
> ---
> arch/arm64/kvm/vgic/vgic-init.c | 1 -
> arch/arm64/kvm/vgic/vgic-its.c | 7 ++-----
> arch/arm64/kvm/vgic/vgic.c | 1 -
> include/kvm/arm_vgic.h | 1 -
> 4 files changed, 2 insertions(+), 8 deletions(-)
>
> diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c
> index 411719053107..e25672d6e846 100644
> --- a/arch/arm64/kvm/vgic/vgic-init.c
> +++ b/arch/arm64/kvm/vgic/vgic-init.c
> @@ -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);
> diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
> index a2d95a279798..0486d3779d11 100644
> --- a/arch/arm64/kvm/vgic/vgic-its.c
> +++ b/arch/arm64/kvm/vgic/vgic-its.c
> @@ -74,10 +74,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 +97,6 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid,
> return ERR_PTR(ret);
> }
>
> - list_add_tail(&irq->lpi_list, &dist->lpi_list_head);
> dist->lpi_list_count++;
>
> out_unlock:
> diff --git a/arch/arm64/kvm/vgic/vgic.c b/arch/arm64/kvm/vgic/vgic.c
> index d90c42ff051d..e58ce68e325c 100644
> --- a/arch/arm64/kvm/vgic/vgic.c
> +++ b/arch/arm64/kvm/vgic/vgic.c
> @@ -121,7 +121,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--;
>
> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> index 795b35656b54..39037db3fa90 100644
> --- a/include/kvm/arm_vgic.h
> +++ b/include/kvm/arm_vgic.h
> @@ -277,7 +277,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 */

You seem to be missing some of it (patch against the full series, so
context will be wrong):

diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
index 46ff21fea785..3de41ee5e6ee 100644
--- a/arch/arm64/kvm/vgic/vgic-its.c
+++ b/arch/arm64/kvm/vgic/vgic-its.c
@@ -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);

diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
index f3fc2cc922ce..4439039ccd45 100644
--- a/include/kvm/arm_vgic.h
+++ b/include/kvm/arm_vgic.h
@@ -118,7 +118,6 @@ struct irq_ops {
struct vgic_irq {
raw_spinlock_t irq_lock; /* Protects the content of the struct */
struct rcu_head rcu;
- 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

M.

--
Without deviation from the norm, progress is not possible.