genirq: Wake up irq thread after action has been installed
The wake_up_process() of the new irq thread in __setup_irq() is too early as the irqaction is not yet fully initialized especially action->irq is not yet set. The interrupt thread might dereference the wrong irq descriptor. Move the wakeup after the action is installed and action->irq has been set. Reported-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Michael Buesch <mb@bu3sch.de>
This commit is contained in:
parent
2d860ad76f
commit
69ab849439
|
@ -607,7 +607,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
||||||
*/
|
*/
|
||||||
get_task_struct(t);
|
get_task_struct(t);
|
||||||
new->thread = t;
|
new->thread = t;
|
||||||
wake_up_process(t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -690,6 +689,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
||||||
(int)(new->flags & IRQF_TRIGGER_MASK));
|
(int)(new->flags & IRQF_TRIGGER_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new->irq = irq;
|
||||||
*old_ptr = new;
|
*old_ptr = new;
|
||||||
|
|
||||||
/* Reset broken irq detection when installing new handler */
|
/* Reset broken irq detection when installing new handler */
|
||||||
|
@ -707,7 +707,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
||||||
|
|
||||||
spin_unlock_irqrestore(&desc->lock, flags);
|
spin_unlock_irqrestore(&desc->lock, flags);
|
||||||
|
|
||||||
new->irq = irq;
|
/*
|
||||||
|
* Strictly no need to wake it up, but hung_task complains
|
||||||
|
* when no hard interrupt wakes the thread up.
|
||||||
|
*/
|
||||||
|
if (new->thread)
|
||||||
|
wake_up_process(new->thread);
|
||||||
|
|
||||||
register_irq_proc(irq, desc);
|
register_irq_proc(irq, desc);
|
||||||
new->dir = NULL;
|
new->dir = NULL;
|
||||||
register_handler_proc(irq, new);
|
register_handler_proc(irq, new);
|
||||||
|
|
Loading…
Reference in New Issue