KVM: arm/arm64: GICv4: Propagate affinity changes to the physical ITS
authorMarc Zyngier <marc.zyngier@arm.com>
Fri, 27 Oct 2017 14:28:42 +0000 (15:28 +0100)
committerChristoffer Dall <christoffer.dall@linaro.org>
Fri, 10 Nov 2017 08:29:37 +0000 (09:29 +0100)
When the guest issues an affinity change, we need to tell the physical
ITS that we're now targetting a new vcpu.  This is done by extracting
the current mapping, updating the target, and reapplying the mapping.

Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
virt/kvm/arm/vgic/vgic-its.c

index ad14af8a44123c05ea0e9400a4bee4817413b497..80bea7021e2ef5e7cd3b7234023d295245f271c2 100644 (file)
@@ -338,11 +338,25 @@ static int vgic_copy_lpi_list(struct kvm_vcpu *vcpu, u32 **intid_ptr)
 
 static int update_affinity(struct vgic_irq *irq, struct kvm_vcpu *vcpu)
 {
+       int ret = 0;
+
        spin_lock(&irq->irq_lock);
        irq->target_vcpu = vcpu;
        spin_unlock(&irq->irq_lock);
 
-       return 0;
+       if (irq->hw) {
+               struct its_vlpi_map map;
+
+               ret = its_get_vlpi(irq->host_irq, &map);
+               if (ret)
+                       return ret;
+
+               map.vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
+
+               ret = its_map_vlpi(irq->host_irq, &map);
+       }
+
+       return ret;
 }
 
 /*