linux-sg2042/kernel/irq
Thomas Gleixner 6d83f94db9 genirq: Disable the SHIRQ_DEBUG call in request_threaded_irq for now
With CONFIG_SHIRQ_DEBUG=y we call a newly installed interrupt handler
in request_threaded_irq().

The original implementation (commit a304e1b8) called the handler
_BEFORE_ it was installed, but that caused problems with handlers
calling disable_irq_nosync(). See commit 377bf1e4.

It's braindead in the first place to call disable_irq_nosync in shared
handlers, but ....

Moving this call after we installed the handler looks innocent, but it
is very subtle broken on SMP.

Interrupt handlers rely on the fact, that the irq core prevents
reentrancy.

Now this debug call violates that promise because we run the handler
w/o the IRQ_INPROGRESS protection - which we cannot apply here because
that would result in a possibly forever masked interrupt line.

A concurrent real hardware interrupt on a different CPU results in
handler reentrancy and can lead to complete wreckage, which was
unfortunately observed in reality and took a fricking long time to
debug.

Leave the code here for now. We want this debug feature, but that's
not easy to fix. We really should get rid of those
disable_irq_nosync() abusers and remove that function completely.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Anton Vorontsov <avorontsov@ru.mvista.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Arjan van de Ven <arjan@infradead.org>
Cc: stable@kernel.org # .28 -> .37
2011-02-19 12:11:13 +01:00
..
Kconfig genirq: Remove __do_IRQ 2011-01-21 11:55:31 +01:00
Makefile genirq: Remove the now unused sparse irq leftovers 2010-10-12 16:53:44 +02:00
autoprobe.c genirq: Provide compat handling for chip->set_type() 2010-10-04 12:43:47 +02:00
chip.c genirq: Sanitize dynamic irq handling 2010-10-12 16:53:44 +02:00
devres.c devres/irq: Fix devm_irq_match comment 2010-02-11 16:01:02 +01:00
dummychip.c genirq: Fix CONFIG_GENIRQ_NO_DEPRECATED=y build 2010-10-12 21:59:55 +02:00
handle.c genirq: Remove __do_IRQ 2011-01-21 11:55:31 +01:00
internals.h genirq: Prevent access beyond allocated_irqs bitmap 2011-02-19 12:10:51 +01:00
irqdesc.c genirq: Prevent access beyond allocated_irqs bitmap 2011-02-19 12:10:51 +01:00
manage.c genirq: Disable the SHIRQ_DEBUG call in request_threaded_irq for now 2011-02-19 12:11:13 +01:00
migration.c genirq: Prevent irq storm on migration 2011-02-02 22:15:08 +01:00
pm.c genirq: Convert irq_desc.lock to raw_spinlock 2009-12-14 23:55:33 +01:00
proc.c genirq: Fix incorrect proc spurious output 2010-12-01 08:44:26 +01:00
resend.c genirq: Prevent access beyond allocated_irqs bitmap 2011-02-19 12:10:51 +01:00
spurious.c genirq: Provide config option to disable deprecated code 2010-10-04 13:40:24 +02:00