• Thomas Gleixner's avatar
    genirq: Disable interrupts for force threaded handlers · 81e2073c
    Thomas Gleixner authored
    With interrupt force threading all device interrupt handlers are invoked
    from kernel threads. Contrary to hard interrupt context the invocation only
    disables bottom halfs, but not interrupts. This was an oversight back then
    because any code like this will have an issue:
    
    thread(irq_A)
      irq_handler(A)
        spin_lock(&foo->lock);
    
    interrupt(irq_B)
      irq_handler(B)
        spin_lock(&foo->lock);
    
    This has been triggered with networking (NAPI vs. hrtimers) and console
    drivers where printk() happens from an interrupt which interrupted the
    force threaded handler.
    
    Now people noticed and started to change the spin_lock() in the handler to
    spin_lock_irqsave() which affects performance or add IRQF_NOTHREAD to the
    interrupt request which in turn breaks RT.
    
    Fix the root cause and not the symptom and disable interrupts before
    invoking the force threaded handler which preserves the regular semantics
    and the usefulness of the interrupt force threading as a general debugging
    tool.
    
    For not RT this is not changing much, except that during the execution of
    the threaded handler interrupts are delayed until the handler
    returns. Vs. scheduling and softirq processing there is no difference.
    
    For RT kernels there is no issue.
    
    Fixes: 8d32a307 ("genirq: Provide forced interrupt threading")
    Reported-by: default avatarJohan Hovold <johan@kernel.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarJohan Hovold <johan@kernel.org>
    Acked-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Link: https://lore.kernel.org/r/20210317143859.513307808@linutronix.de
    81e2073c
manage.c 75.4 KB