genirq: Delegate irq affinity setting to the irq thread
authorThomas Gleixner <tglx@linutronix.de>
Tue, 21 Jul 2009 09:09:39 +0000 (11:09 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 21 Jul 2009 12:35:07 +0000 (14:35 +0200)
commit591d2fb02ea80472d846c0b8507007806bdd69cc
treec7962a95a47bbdf664f15a504eff24c351f33613
parentaea1f7964ae6cba5eb419a958956deb9016b3341
genirq: Delegate irq affinity setting to the irq thread

irq_set_thread_affinity() calls set_cpus_allowed_ptr() which might
sleep, but irq_set_thread_affinity() is called with desc->lock held
and can be called from hard interrupt context as well. The code has
another bug as it does not hold a ref on the task struct as required
by set_cpus_allowed_ptr().

Just set the IRQTF_AFFINITY bit in action->thread_flags. The next time
the thread runs it migrates itself. Solves all of the above problems
nicely.

Add kerneldoc to irq_set_thread_affinity() while at it.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <new-submission>
include/linux/interrupt.h
kernel/irq/internals.h
kernel/irq/manage.c
kernel/irq/migration.c