diff options
author | Christoffer Dall <christoffer.dall@linaro.org> | 2015-11-24 10:34:31 -0500 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2015-11-24 12:08:37 -0500 |
commit | 9f958c11b780af74fc311b96d6124740aa21cc68 (patch) | |
tree | 1bd4c43e53f02a7513bb94d2992e1cf64c4863af | |
parent | 0e3dfda91d9fe8e2c4d0b5d21434b173a241eeaf (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.c | 16 |
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) | |||
1417 | static bool vgic_sync_hwirq(struct kvm_vcpu *vcpu, int lr, struct vgic_lr vlr) | 1417 | static 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); |