linux/kernel/irq
Thomas Gleixner 46e48e2573 genirq: Move irq resource handling out of spinlocked region
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: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Marc 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
2017-07-04 12:46:16 +02:00
..
affinity.c genirq/affinity: Assign vectors to all present CPUs 2017-06-22 18:21:26 +02:00
autoprobe.c genirq: Add force argument to irq_startup() 2017-06-22 18:21:24 +02:00
chip.c genirq: Force inlining of __irq_startup_managed to prevent build failure 2017-07-04 12:36:44 +02:00
cpuhotplug.c genirq/cpuhotplug: Avoid irq affinity setting for single targets 2017-06-22 18:21:25 +02:00
debug.h irq: hide debug macros so they don't collide with others. 2012-04-23 12:30:03 -04:00
debugfs.c genirq/debugfs: Remove pointless NULL pointer check 2017-06-24 11:43:53 +02:00
devres.c irq/generic-chip: Provide devm_irq_setup_generic_chip() 2017-06-21 15:53:11 +02:00
dummychip.c Merge branch 'linus' into irq/core 2015-06-05 22:25:01 +02:00
generic-chip.c irq/generic-chip: Export irq_init_generic_chip() locally 2017-06-21 15:53:11 +02:00
handle.c genirq/timings: Add infrastructure to track the interrupt timings 2017-06-24 11:44:11 +02:00
internals.h genirq/debugfs: Fix build for !CONFIG_IRQ_DOMAIN 2017-07-04 12:36:43 +02:00
ipi.c genirq: Fix missing irq allocation affinity hint 2016-07-19 10:49:47 +02:00
irqdesc.c genirq: Add mutex to irq desc to serialize request/free_irq() 2017-07-04 12:46:16 +02:00
irqdomain.c genirq/irqdomain: Remove auto-recursive hierarchy support 2017-06-22 18:29:34 +02:00
Kconfig genirq/timings: Add infrastructure to track the interrupt timings 2017-06-24 11:44:11 +02:00
Makefile genirq/timings: Add infrastructure to track the interrupt timings 2017-06-24 11:44:11 +02:00
manage.c genirq: Move irq resource handling out of spinlocked region 2017-07-04 12:46:16 +02:00
migration.c genirq: Provide irq_fixup_move_pending() 2017-06-22 18:21:13 +02:00
msi.c genirq/irqdomain: Remove auto-recursive hierarchy support 2017-06-22 18:29:34 +02:00
pm.c Merge branches 'irq-urgent-for-linus' and 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2015-11-15 09:30:48 -08:00
proc.c genirq: Introduce effective affinity mask 2017-06-22 18:21:20 +02:00
resend.c genirq: Remove irq argument from irq flow handlers 2015-09-16 15:47:51 +02:00
settings.h genirq: Add flag to force mask in disable_irq[_nosync]() 2015-10-11 11:33:42 +02:00
spurious.c genirq: Clarify logic calculating bogus irqreturn_t values 2017-02-16 15:32:19 +01:00
timings.c genirq/timings: Add infrastructure for estimating the next interrupt arrival time 2017-06-24 11:44:39 +02:00