When checking if there are any pending IRQs for the VM, consider the
active state and priority of the IRQs as well.
Otherwise we could be continuously scheduling a guest hypervisor without
it seeing an IRQ.
Signed-off-by: Christoffer Dall <christoffer.dall@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
        struct vgic_irq *irq;
        bool pending = false;
        unsigned long flags;
+       struct vgic_vmcr vmcr;
 
        if (!vcpu->kvm->arch.vgic.enabled)
                return false;
        if (vcpu->arch.vgic_cpu.vgic_v3.its_vpe.pending_last)
                return true;
 
+       vgic_get_vmcr(vcpu, &vmcr);
+
        spin_lock_irqsave(&vgic_cpu->ap_list_lock, flags);
 
        list_for_each_entry(irq, &vgic_cpu->ap_list_head, ap_list) {
                spin_lock(&irq->irq_lock);
-               pending = irq_is_pending(irq) && irq->enabled;
+               pending = irq_is_pending(irq) && irq->enabled &&
+                         !irq->active &&
+                         irq->priority < vmcr.pmr;
                spin_unlock(&irq->irq_lock);
 
                if (pending)