--- x/arch/arm64/kvm/vgic/vgic.c +++ y/arch/arm64/kvm/vgic/vgic.c @@ -146,20 +146,25 @@ void vgic_flush_pending_lpis(struct kvm_ struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; struct vgic_irq *irq, *tmp; unsigned long flags; + LIST_HEAD(head); raw_spin_lock_irqsave(&vgic_cpu->ap_list_lock, flags); list_for_each_entry_safe(irq, tmp, &vgic_cpu->ap_list_head, ap_list) { if (irq->intid >= VGIC_MIN_LPI) { raw_spin_lock(&irq->irq_lock); - list_del(&irq->ap_list); + list_move(&irq->ap_list, &head); irq->vcpu = NULL; raw_spin_unlock(&irq->irq_lock); - vgic_put_irq(vcpu->kvm, irq); } } raw_spin_unlock_irqrestore(&vgic_cpu->ap_list_lock, flags); + + list_for_each_entry_safe(irq, tmp, &head, ap_list) { + list_del(&irq->ap_list); + vgic_put_irq(vcpu->kvm, irq); + } } void vgic_irq_set_phys_pending(struct vgic_irq *irq, bool pending)