• Vivek Goyal's avatar
    [PATCH] x86_64: timer interrupt lockup due to pending interrupt · da7ed9f9
    Vivek Goyal authored
    o check_timer() routine fails while second kernel is booting after a crash
      on an opetron box. Problem happens because timer vector (0x31) seems to be
      locked.
    
    o After a system crash, it is not safe to service interrupts any more, hence
      interrupts are disabled. This leads to pending interrupts at LAPIC. LAPIC
      sends these interrupts to the CPU during early boot of second kernel. Other
      pending interrupts are discarded saying unexpected trap but timer interrupt
      is serviced and CPU does not issue an LAPIC EOI because it think this
      interrupt came from i8259 and sends ack to 8259. This leads to vector 0x31
      locking as LAPIC does not clear respective ISR and keeps on waiting for
      EOI.
    
    o This patch issues extra EOI for the pending interrupts who have ISR set.
    
    o Though today only timer seems to be the special case because in early
      boot it thinks interrupts are coming from i8259 and uses
      mask_and_ack_8259A() as ack handler and does not issue LAPIC EOI. But
      probably doing it in generic manner for all vectors makes sense.
    Signed-off-by: default avatarVivek Goyal <vgoyal@in.ibm.com>
    Signed-off-by: default avatarAndi Kleen <ak@suse.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    da7ed9f9
apic.c 29.4 KB