• Thomas Gleixner's avatar
    genirq: Move irq resource handling out of spinlocked region · 46e48e25
    Thomas Gleixner authored
    Aside of being conceptually wrong, there is also an actual (hard to
    trigger and mostly theoretical) problem.
    
    CPU0				CPU1
    free_irq(X)			interrupt X
    				spin_lock(desc->lock)
    				wake irq thread()
    				spin_unlock(desc->lock)
    spin_lock(desc->lock)
    remove action()
    shutdown_irq()			
    release_resources()		thread_handler()
    spin_unlock(desc->lock)		  access released resources.
    
    synchronize_irq()
    
    Move the release resources invocation after synchronize_irq() so it's
    guaranteed that the threaded handler has finished.
    
    Move the resource request call out of the desc->lock held region as well,
    so the invocation context is the same for both request and release.
    
    This solves the problems with those functions on RT as well.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Cc: Heiko Stuebner <heiko@sntech.de>
    Cc: Julia Cartwright <julia@ni.com>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Brian Norris <briannorris@chromium.org>
    Cc: Doug Anderson <dianders@chromium.org>
    Cc: linux-rockchip@lists.infradead.org
    Cc: John Keeping <john@metanate.com>
    Cc: linux-gpio@vger.kernel.org
    Link: http://lkml.kernel.org/r/20170629214344.117028181@linutronix.de
    46e48e25
manage.c 54.1 KB