int vgic_its_invall(struct kvm_vcpu *vcpu)
 {
        struct kvm *kvm = vcpu->kvm;
-       int irq_count, i = 0;
-       u32 *intids;
-
-       irq_count = vgic_copy_lpi_list(kvm, vcpu, &intids);
-       if (irq_count < 0)
-               return irq_count;
+       struct vgic_dist *dist = &kvm->arch.vgic;
+       struct vgic_irq *irq;
+       unsigned long intid;
 
-       for (i = 0; i < irq_count; i++) {
-               struct vgic_irq *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;
+
                update_lpi_config(kvm, irq, vcpu, false);
                vgic_put_irq(kvm, irq);
        }
 
-       kfree(intids);
-
        if (vcpu->arch.vgic_cpu.vgic_v3.its_vpe.its_vm)
                its_invall_vpe(&vcpu->arch.vgic_cpu.vgic_v3.its_vpe);