genirq: Provide generic_handle_domain_irq_safe().
commit 509853f9e1
("genirq: Provide generic_handle_irq_safe()")
addressed the problem of demultiplexing interrupt handlers which are force
threaded on PREEMPT_RT enabled kernels which means that the demultiplexed
handler is invoked with interrupts enabled which triggers a lockdep
warning due to a non-irq safe lock acquisition.
The same problem exists for the irq domain based interrupt handling via
generic_handle_domain_irq() which has been reported against the AMD
pin-ctrl driver.
Provide generic_handle_domain_irq_safe() which can used from any context.
[ tglx: Split the usage sites out and massaged changelog ]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/YnkfWFzvusFFktSt@linutronix.de
Link: https://bugzilla.kernel.org/show_bug.cgi?id=215954
This commit is contained in:
parent
521a547ced
commit
6a164c6469
|
@ -169,6 +169,7 @@ int generic_handle_irq_safe(unsigned int irq);
|
|||
* conversion failed.
|
||||
*/
|
||||
int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq);
|
||||
int generic_handle_domain_irq_safe(struct irq_domain *domain, unsigned int hwirq);
|
||||
int generic_handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -705,6 +705,30 @@ int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
|
||||
|
||||
/**
|
||||
* generic_handle_irq_safe - Invoke the handler for a HW irq belonging
|
||||
* to a domain from any context.
|
||||
* @domain: The domain where to perform the lookup
|
||||
* @hwirq: The HW irq number to convert to a logical one
|
||||
*
|
||||
* Returns: 0 on success, a negative value on error.
|
||||
*
|
||||
* This function can be called from any context (IRQ or process
|
||||
* context). If the interrupt is marked as 'enforce IRQ-context only' then
|
||||
* the function must be invoked from hard interrupt context.
|
||||
*/
|
||||
int generic_handle_domain_irq_safe(struct irq_domain *domain, unsigned int hwirq)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
local_irq_save(flags);
|
||||
ret = handle_irq_desc(irq_resolve_mapping(domain, hwirq));
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(generic_handle_domain_irq_safe);
|
||||
|
||||
/**
|
||||
* generic_handle_domain_nmi - Invoke the handler for a HW nmi belonging
|
||||
* to a domain.
|
||||
|
|
Loading…
Reference in New Issue