Commit cced50c9280ef7ca1af48080707a170efa1adfa0

Authored by Christoffer Dall
1 parent dbf20f9d81

arm/arm64: KVM: vgic: Clear queued flags on unqueue

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>

Showing 1 changed file with 3 additions and 1 deletions Side-by-side Diff

... ... @@ -667,8 +667,10 @@
667 667 * active), then the LR does not hold any useful info and can
668 668 * be marked as free for other use.
669 669 */
670   - if (!(lr.state & LR_STATE_MASK))
  670 + if (!(lr.state & LR_STATE_MASK)) {
671 671 vgic_retire_lr(i, lr.irq, vcpu);
  672 + vgic_irq_clear_queued(vcpu, lr.irq);
  673 + }
672 674  
673 675 /* Finally update the VGIC state. */
674 676 vgic_update_state(vcpu->kvm);