vgic_hw_irq_change_active(vcpu, irq, active, !requester_vcpu);
        } else {
                u32 model = vcpu->kvm->arch.vgic.vgic_model;
+               u8 active_source;
 
                irq->active = active;
+
+               /*
+                * The GICv2 architecture indicates that the source CPUID for
+                * an SGI should be provided during an EOI which implies that
+                * the active state is stored somewhere, but at the same time
+                * this state is not architecturally exposed anywhere and we
+                * have no way of knowing the right source.
+                *
+                * This may lead to a VCPU not being able to receive
+                * additional instances of a particular SGI after migration
+                * for a GICv2 VM on some GIC implementations.  Oh well.
+                */
+               active_source = (requester_vcpu) ? requester_vcpu->vcpu_id : 0;
+
                if (model == KVM_DEV_TYPE_ARM_VGIC_V2 &&
                    active && vgic_irq_is_sgi(irq->intid))
-                       irq->active_source = requester_vcpu->vcpu_id;
+                       irq->active_source = active_source;
        }
 
        if (irq->active)