]> www.infradead.org Git - nvme.git/commitdiff
KVM: arm64: vgic-its: Walk LPI xarray in vgic_its_cmd_handle_movall()
authorOliver Upton <oliver.upton@linux.dev>
Mon, 22 Apr 2024 20:01:43 +0000 (20:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 25 Apr 2024 12:19:55 +0000 (13:19 +0100)
The new LPI xarray makes it possible to walk the VM's LPIs without
holding a lock, meaning that vgic_copy_lpi_list() is no longer
necessary. Prepare for the deletion by walking the LPI xarray directly
in vgic_its_cmd_handle_movall().

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

index 07706c5e996b477a7fdd492bb6928f462764f8c3..420a71597b78ec01186fda375df3779dca0cd34c 100644 (file)
@@ -1420,10 +1420,10 @@ static int vgic_its_cmd_handle_invall(struct kvm *kvm, struct vgic_its *its,
 static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
                                      u64 *its_cmd)
 {
+       struct vgic_dist *dist = &kvm->arch.vgic;
        struct kvm_vcpu *vcpu1, *vcpu2;
        struct vgic_irq *irq;
-       u32 *intids;
-       int irq_count, i;
+       unsigned long intid;
 
        /* We advertise GITS_TYPER.PTA==0, making the address the vcpu ID */
        vcpu1 = kvm_get_vcpu_by_id(kvm, its_cmd_get_target_addr(its_cmd));
@@ -1435,12 +1435,8 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
        if (vcpu1 == vcpu2)
                return 0;
 
-       irq_count = vgic_copy_lpi_list(kvm, vcpu1, &intids);
-       if (irq_count < 0)
-               return irq_count;
-
-       for (i = 0; i < irq_count; i++) {
-               irq = vgic_get_irq(kvm, NULL, intids[i]);
+       xa_for_each(&dist->lpi_xa, intid, irq) {
+               irq = vgic_get_irq(kvm, NULL, intid);
                if (!irq)
                        continue;
 
@@ -1451,7 +1447,6 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
 
        vgic_its_invalidate_cache(kvm);
 
-       kfree(intids);
        return 0;
 }