ioapic: allow buggy guests mishandling level-triggered interrupts to make progress
commit958a01dab8e02fc49f4fd619fad8c82a1108afdb
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 2 Apr 2019 08:02:15 +0000 (2 10:02 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 17 May 2019 13:19:39 +0000 (17 15:19 +0200)
treecdd63e978ad652d0d33686b2804a7817125d7468
parent29de2804014097f8d0e6eaec3318164405afe317
ioapic: allow buggy guests mishandling level-triggered interrupts to make progress

It was found that Hyper-V 2016 on KVM in some configurations (q35 machine +
piix4-usb-uhci) hangs on boot. Root-cause was that one of Hyper-V
level-triggered interrupt handler performs EOI before fixing the cause of
the interrupt. This results in IOAPIC keep re-raising the level-triggered
interrupt after EOI because irq-line remains asserted.

Gory details: https://www.spinics.net/lists/kvm/msg184484.html
(the whole thread).

Turns out we were dealing with similar issues before; in-kernel IOAPIC
implementation has commit 184564efae4d ("kvm: ioapic: conditionally delay
irq delivery duringeoi broadcast") which describes a very similar issue.

Steal the idea from the above mentioned commit for IOAPIC implementation in
QEMU. SUCCESSIVE_IRQ_MAX_COUNT, delay and the comment are borrowed as well.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20190402080215.10747-1-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
hw/intc/ioapic.c
hw/intc/trace-events
include/hw/i386/ioapic_internal.h