ioapic: coalesce level interrupts
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 30 Jul 2015 08:19:24 +0000 (10:19 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 25 Sep 2015 10:04:42 +0000 (12:04 +0200)
If a level-triggered interrupt goes down and back up before the
corresponding EOI, it should be coalesced.  This fixes one testcase
in kvm-unit-tests' ioapic.flat.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
hw/intc/ioapic.c

index b527932382677363299bcb8668b9f950a103bcf8..6ad3c66c1b3e6171b8f93c2caa496e58a65b28c4 100644 (file)
@@ -98,7 +98,9 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
             /* level triggered */
             if (level) {
                 s->irr |= mask;
-                ioapic_service(s);
+                if (!(entry & IOAPIC_LVT_REMOTE_IRR)) {
+                    ioapic_service(s);
+                }
             } else {
                 s->irr &= ~mask;
             }