genirq: Provide generic_handle_domain_irq_safe().
commit 509853f9e1e7b ("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.
|
* conversion failed.
|
||||||
*/
|
*/
|
||||||
int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq);
|
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);
|
int generic_handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -705,6 +705,30 @@ int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(generic_handle_domain_irq);
|
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
|
* generic_handle_domain_nmi - Invoke the handler for a HW nmi belonging
|
||||||
* to a domain.
|
* to a domain.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user