linux/kernel/irq
Thomas Gleixner 8d32a307e4 genirq: Provide forced interrupt threading
Add a commandline parameter "threadirqs" which forces all interrupts except
those marked IRQF_NO_THREAD to run threaded. That's mostly a debug option to
allow retrieving better debug data from crashing interrupt handlers. If
"threadirqs" is not enabled on the kernel command line, then there is no
impact in the interrupt hotpath.

Architecture code needs to select CONFIG_IRQ_FORCED_THREADING after
marking the interrupts which cant be threaded IRQF_NO_THREAD. All
interrupts which have IRQF_TIMER set are implict marked
IRQF_NO_THREAD. Also all PER_CPU interrupts are excluded.

Forced threading hard interrupts also forces all soft interrupt
handling into thread context.

When enabled it might slow down things a bit, but for debugging problems in
interrupt code it's a reasonable penalty as it does not immediately
crash and burn the machine when an interrupt handler is buggy.

Some test results on a Core2Duo machine:

Cache cold run of:
 # time git grep irq_desc

      non-threaded       threaded
 real 1m18.741s          1m19.061s
 user 0m1.874s           0m1.757s
 sys  0m5.843s           0m5.427s

 # iperf -c server
non-threaded
[  3]  0.0-10.0 sec  1.09 GBytes   933 Mbits/sec
[  3]  0.0-10.0 sec  1.09 GBytes   934 Mbits/sec
[  3]  0.0-10.0 sec  1.09 GBytes   933 Mbits/sec
threaded
[  3]  0.0-10.0 sec  1.09 GBytes   939 Mbits/sec
[  3]  0.0-10.0 sec  1.09 GBytes   934 Mbits/sec
[  3]  0.0-10.0 sec  1.09 GBytes   937 Mbits/sec

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20110223234956.772668648@linutronix.de>
2011-02-26 11:57:18 +01:00
..
autoprobe.c genirq: Remove real old transition functions 2011-02-19 12:58:23 +01:00
chip.c genirq: Fix misplaced status update in irq_disable() 2011-02-21 21:19:59 +01:00
compat.h genirq: Move IRQ_AFFINITY_SET to core 2011-02-19 12:58:20 +01:00
debug.h genirq: Move debug code to separate header 2011-02-19 12:58:19 +01: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: Prepare the handling of shared oneshot interrupts 2011-02-25 20:24:21 +01:00
internals.h genirq: Provide forced interrupt threading 2011-02-26 11:57:18 +01:00
irqdesc.c genirq: Use IRQ_BITMAP_BITS as search size in irq_alloc_descs() 2011-02-21 21:20:00 +01:00
Kconfig genirq: Provide forced interrupt threading 2011-02-26 11:57:18 +01:00
Makefile genirq: Remove the now unused sparse irq leftovers 2010-10-12 16:53:44 +02:00
manage.c genirq: Provide forced interrupt threading 2011-02-26 11:57:18 +01:00
migration.c genirq: Implement irq_data based move_*_irq() versions 2011-02-19 12:58:25 +01:00
pm.c genirq: Move wakeup state to irq_data 2011-02-19 12:58:22 +01:00
proc.c genirq: Reuse existing can set affinty check 2011-02-19 12:58:20 +01:00
resend.c genirq: Mirror irq trigger type bits in irq_data.state 2011-02-19 12:58:20 +01:00
settings.h genirq: Remove desc->status when GENERIC_HARDIRQS_NO_COMPAT=y 2011-02-19 12:58:22 +01:00
spurious.c genirq: Wrap the remaning IRQ_* flags 2011-02-19 12:58:21 +01:00