• Zhang Haoyu's avatar
    kvm: ioapic: conditionally delay irq delivery duringeoi broadcast · 184564ef
    Zhang Haoyu authored
    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: default avatarJason Wang <jasowang@redhat.com>
    Signed-off-by: default avatarZhang Haoyu <zhanghy@sangfor.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    184564ef
ioapic.c 17.1 KB