genirq: prevent wakeup of freed irq thread
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 13 Aug 2009 20:05:10 +0000 (13:05 -0700)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 13 Aug 2009 21:09:27 +0000 (23:09 +0200)
commit2d860ad76f4ee4d2eba0fe3797c8d7cdce432cc0
tree928e3a162ce9bf9294afd138f5609cf3b70a747b
parent3493e84de60590d3012139187f631f2dfbf0887f
genirq: prevent wakeup of freed irq thread

free_irq() can remove an irqaction while the corresponding interrupt
is in progress, but free_irq() sets action->thread to NULL
unconditionally, which might lead to a NULL pointer dereference in
handle_IRQ_event() when the hard interrupt context tries to wake up
the handler thread.

Prevent this by moving the thread stop after synchronize_irq(). No
need to set action->thread to NULL either as action is going to be
freed anyway.

This fixes a boot crash reported against preempt-rt which uses the
mainline irq threads code to implement full irq threading.

[ tglx: removed local irqthread variable ]

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
kernel/irq/manage.c