• Thomas Gleixner's avatar
    x86/i8259: Mark legacy PIC interrupts with IRQ_LEVEL · 5fa55950
    Thomas Gleixner authored
    Baoquan reported that after triggering a crash the subsequent crash-kernel
    fails to boot about half of the time. It triggers a NULL pointer
    dereference in the periodic tick code.
    
    This happens because the legacy timer interrupt (IRQ0) is resent in
    software which happens in soft interrupt (tasklet) context. In this context
    get_irq_regs() returns NULL which leads to the NULL pointer dereference.
    
    The reason for the resend is a spurious APIC interrupt on the IRQ0 vector
    which is captured and leads to a resend when the legacy timer interrupt is
    enabled. This is wrong because the legacy PIC interrupts are level
    triggered and therefore should never be resent in software, but nothing
    ever sets the IRQ_LEVEL flag on those interrupts, so the core code does not
    know about their trigger type.
    
    Ensure that IRQ_LEVEL is set when the legacy PCI interrupts are set up.
    
    Fixes: a4633adc ("[PATCH] genirq: add genirq sw IRQ-retrigger")
    Reported-by: default avatarBaoquan He <bhe@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarBaoquan He <bhe@redhat.com>
    Link: https://lore.kernel.org/r/87mt6rjrra.ffs@tglx
    5fa55950
i8259.c 11 KB