mirror of
https://github.com/torvalds/linux.git
synced 2026-03-09 18:16:36 +01:00
genirq: Warn about using IRQF_ONESHOT without a threaded handler
IRQF_ONESHOT disables the interrupt source until after the threaded handler completed its work. This is needed to allow the threaded handler to run - otherwise the CPU will get back to the interrupt handler because the interrupt source remains active and the threaded handler will not able to do its work. Specifying IRQF_ONESHOT without a threaded handler does not make sense. It could be a leftover if the handler _was_ threaded and changed back to primary and the flag was not removed. This can be problematic in the `threadirqs' case because the handler is exempt from forced-threading. This in turn can become a problem on a PREEMPT_RT system if the handler attempts to acquire sleeping locks. Warn about missing threaded handlers with the IRQF_ONESHOT flag. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Link: https://patch.msgid.link/20260112134013.eQWyReHR@linutronix.de
This commit is contained in:
parent
90876d9b37
commit
aef30c8d56
1 changed files with 7 additions and 0 deletions
|
|
@ -1473,6 +1473,13 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|||
if (!(new->flags & IRQF_TRIGGER_MASK))
|
||||
new->flags |= irqd_get_trigger_type(&desc->irq_data);
|
||||
|
||||
/*
|
||||
* IRQF_ONESHOT means the interrupt source in the IRQ chip will be
|
||||
* masked until the threaded handled is done. If there is no thread
|
||||
* handler then it makes no sense to have IRQF_ONESHOT.
|
||||
*/
|
||||
WARN_ON_ONCE(new->flags & IRQF_ONESHOT && !new->thread_fn);
|
||||
|
||||
/*
|
||||
* Check whether the interrupt nests into another interrupt
|
||||
* thread.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue