aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoffer Dall <christoffer.dall@linaro.org>2015-11-24 10:34:31 -0500
committerChristoffer Dall <christoffer.dall@linaro.org>2015-11-24 12:08:37 -0500
commit9f958c11b780af74fc311b96d6124740aa21cc68 (patch)
tree1bd4c43e53f02a7513bb94d2992e1cf64c4863af
parent0e3dfda91d9fe8e2c4d0b5d21434b173a241eeaf (diff)
KVM: arm/arm64: vgic: Trust the LR state for HW IRQs
We were probing the physial distributor state for the active state of a HW virtual IRQ, because we had seen evidence that the LR state was not cleared when the guest deactivated a virtual interrupted. However, this issue turned out to be a software bug in the GIC, which was solved by: 84aab5e68c2a5e1e18d81ae8308c3ce25d501b29 (KVM: arm/arm64: arch_timer: Preserve physical dist. active state on LR.active, 2015-11-24) Therefore, get rid of the complexities and just look at the LR. Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
-rw-r--r--virt/kvm/arm/vgic.c16
1 files changed, 2 insertions, 14 deletions
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index 97e2c088e1e9..65461f821a75 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -1417,25 +1417,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
1417static bool vgic_sync_hwirq(struct kvm_vcpu *vcpu, int lr, struct vgic_lr vlr) 1417static bool vgic_sync_hwirq(struct kvm_vcpu *vcpu, int lr, struct vgic_lr vlr)
1418{ 1418{
1419 struct vgic_dist *dist = &vcpu->kvm->arch.vgic; 1419 struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
1420 struct irq_phys_map *map;
1421 bool phys_active;
1422 bool level_pending; 1420 bool level_pending;
1423 int ret;
1424 1421
1425 if (!(vlr.state & LR_HW)) 1422 if (!(vlr.state & LR_HW))
1426 return false; 1423 return false;
1427 1424
1428 map = vgic_irq_map_search(vcpu, vlr.irq); 1425 if (vlr.state & LR_STATE_ACTIVE)
1429 BUG_ON(!map); 1426 return false;
1430
1431 ret = irq_get_irqchip_state(map->irq,
1432 IRQCHIP_STATE_ACTIVE,
1433 &phys_active);
1434
1435 WARN_ON(ret);
1436
1437 if (phys_active)
1438 return 0;
1439 1427
1440 spin_lock(&dist->lock); 1428 spin_lock(&dist->lock);
1441 level_pending = process_queued_irq(vcpu, lr, vlr); 1429 level_pending = process_queued_irq(vcpu, lr, vlr);