arm/arm64: KVM: vgic: Clear queued flags on unqueue
authorChristoffer Dall <christoffer.dall@linaro.org>
Sat, 14 Jun 2014 20:37:33 +0000 (22:37 +0200)
committerChristoffer Dall <christoffer.dall@linaro.org>
Thu, 2 Oct 2014 15:19:19 +0000 (17:19 +0200)
If we unqueue a level-triggered interrupt completely, and the LR does
not stick around in the active state (and will therefore no longer
generate a maintenance interrupt), then we should clear the queued flag
so that the vgic can actually queue this level-triggered interrupt at a
later time and deal with its pending state then.

Note: This should actually be properly fixed to handle the active state
on the distributor.

Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
(cherry picked from commit cced50c9280ef7ca1af48080707a170efa1adfa0)
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
virt/kvm/arm/vgic.c

index 769cc7177f100aa381e2ec6cc6a7125c41892cd0..c7d0689760691392fd527d3d37610556dfa79f49 100644 (file)
@@ -667,8 +667,10 @@ static void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)
                 * active), then the LR does not hold any useful info and can
                 * be marked as free for other use.
                 */
-               if (!(lr.state & LR_STATE_MASK))
+               if (!(lr.state & LR_STATE_MASK)) {
                        vgic_retire_lr(i, lr.irq, vcpu);
+                       vgic_irq_clear_queued(vcpu, lr.irq);
+               }
 
                /* Finally update the VGIC state. */
                vgic_update_state(vcpu->kvm);