• Rich Felker's avatar
    irqchip/jcore: Fix lost per-cpu interrupts · c024f06b
    Rich Felker authored
    The J-Core AIC does not have separate interrupt numbers reserved for
    cpu-local vs global interrupts. Instead, the driver requesting the irq
    is expected to know whether its device uses per-cpu interrupts or not.
    Previously it was assumed that handle_simple_irq could work for both
    cases, but it intentionally drops interrupts for an irq number that
    already has a handler running. This resulted in the timer interrupt
    for one cpu being lost when multiple cpus' timers were set for
    approximately the same expiration time, leading to stalls. In theory
    the same could also happen with IPIs.
    
    To solve the problem, instead of registering handle_simple_irq as the
    handler, register a wrapper function which checks whether the irq to
    be handled was requested as per-cpu or not, and passes it to
    handle_simple_irq or handle_percpu_irq accordingly.
    
    Fixes: 981b58f6 ("irqchip/jcore-aic: Add J-Core AIC driver")
    Signed-off-by: default avatarRich Felker <dalias@libc.org>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Jason Cooper <jason@lakedaemon.net>
    Cc: linux-sh@vger.kernel.org
    Link: http://lkml.kernel.org/r/f18cec30bc17e3f52e478dd9f6714bfab02f227f.1476390724.git.dalias@libc.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    c024f06b
irq-jcore-aic.c 3.08 KB