• Nicholas Piggin's avatar
    powerpc/64: Don't recurse irq replay · 5746ca13
    Nicholas Piggin authored
    Interrupt handlers called by soft-pending irq replay code can run
    softirqs, softirq replay enables and disables local irqs, which allows
    interrupts to come in including soft-masked interrupts, and it can
    cause pending irqs to be replayed again. That makes the soft irq replay
    state machine and possible races more complicated and fragile than it
    needs to be.
    
    Use irq_enter/irq_exit around irq replay to prevent softirqs running
    while interrupts are being replayed. Softirqs will now be run at the
    irq_exit() call after all the irq replaying is done. This prevents irqs
    being replayed while irqs are being replayed, and should hopefully make
    things simpler and easier to think about and debug.
    
    A new PACA_IRQ_REPLAYING is added to prevent asynchronous interrupt
    handlers hard-enabling EE while pending irqs are being replayed, because
    that causes new pending irqs to arrive which is also a complexity. This
    means pending irqs won't be profiled quite so well because perf irqs
    can't be taken.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20230121102618.2824429-1-npiggin@gmail.com
    5746ca13
hw_irq.h 12.2 KB