|
@@ -317,11 +317,26 @@ static void vgic_mmio_change_active(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
|
|
|
vgic_hw_irq_change_active(vcpu, irq, active, !requester_vcpu);
|
|
vgic_hw_irq_change_active(vcpu, irq, active, !requester_vcpu);
|
|
|
} else {
|
|
} else {
|
|
|
u32 model = vcpu->kvm->arch.vgic.vgic_model;
|
|
u32 model = vcpu->kvm->arch.vgic.vgic_model;
|
|
|
|
|
+ u8 active_source;
|
|
|
|
|
|
|
|
irq->active = active;
|
|
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 &&
|
|
if (model == KVM_DEV_TYPE_ARM_VGIC_V2 &&
|
|
|
active && vgic_irq_is_sgi(irq->intid))
|
|
active && vgic_irq_is_sgi(irq->intid))
|
|
|
- irq->active_source = requester_vcpu->vcpu_id;
|
|
|
|
|
|
|
+ irq->active_source = active_source;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (irq->active)
|
|
if (irq->active)
|