kvm: ioapic: conditionally delay irq delivery duringeoi broadcast
authorZhang Haoyu <zhanghy@sangfor.com>
Thu, 11 Sep 2014 08:47:04 +0000 (16:47 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Sep 2014 12:44:48 +0000 (14:44 +0200)
commit184564efae4d775225c8fe3b762a56956fb1f827
treece6630689fb883ec69b5c18e299b638c4b1b9454
parent105b21bbf67bb50000a0dc4b547a2f99b6376136
kvm: ioapic: conditionally delay irq delivery duringeoi broadcast

Currently, we call ioapic_service() immediately when we find the irq is still
active during eoi broadcast. But for real hardware, there's some delay between
the EOI writing and irq delivery.  If we do not emulate this behavior, and
re-inject the interrupt immediately after the guest sends an EOI and re-enables
interrupts, a guest might spend all its time in the ISR if it has a broken
handler for a level-triggered interrupt.

Such livelock actually happens with Windows guests when resuming from
hibernation.

As there's no way to recognize the broken handle from new raised ones, this patch
delays an interrupt if 10.000 consecutive EOIs found that the interrupt was
still high.  The guest can then make a little forward progress, until a proper
IRQ handler is set or until some detection routine in the guest (such as
Linux's note_interrupt()) recognizes the situation.

Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Zhang Haoyu <zhanghy@sangfor.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/trace/events/kvm.h
virt/kvm/ioapic.c
virt/kvm/ioapic.h