mirror of https://github.com/torvalds/linux.git
genirq: Split up irq_pm_check_wakeup()
Let the calling code check for the IRQD_WAKEUP_ARMED flag to prepare for a live lock mitigation in the edge type handler. No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Liangyan <liangyan.peng@bytedance.com> Link: https://lore.kernel.org/all/20250718185312.012392426@linutronix.de
This commit is contained in:
parent
4e879dedd5
commit
c609045abc
|
|
@ -488,8 +488,10 @@ static bool irq_can_handle_pm(struct irq_desc *desc)
|
||||||
* and suspended, disable it and notify the pm core about the
|
* and suspended, disable it and notify the pm core about the
|
||||||
* event.
|
* event.
|
||||||
*/
|
*/
|
||||||
if (irq_pm_check_wakeup(desc))
|
if (unlikely(irqd_has_set(irqd, IRQD_WAKEUP_ARMED))) {
|
||||||
|
irq_pm_handle_wakeup(desc);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check whether the interrupt is polled on another CPU */
|
/* Check whether the interrupt is polled on another CPU */
|
||||||
if (unlikely(desc->istate & IRQS_POLL_INPROGRESS)) {
|
if (unlikely(desc->istate & IRQS_POLL_INPROGRESS)) {
|
||||||
|
|
|
||||||
|
|
@ -277,11 +277,11 @@ static inline bool irq_is_nmi(struct irq_desc *desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
bool irq_pm_check_wakeup(struct irq_desc *desc);
|
void irq_pm_handle_wakeup(struct irq_desc *desc);
|
||||||
void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action);
|
void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action);
|
||||||
void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action);
|
void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action);
|
||||||
#else
|
#else
|
||||||
static inline bool irq_pm_check_wakeup(struct irq_desc *desc) { return false; }
|
static inline void irq_pm_handle_wakeup(struct irq_desc *desc) { }
|
||||||
static inline void
|
static inline void
|
||||||
irq_pm_install_action(struct irq_desc *desc, struct irqaction *action) { }
|
irq_pm_install_action(struct irq_desc *desc, struct irqaction *action) { }
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
||||||
|
|
@ -13,17 +13,13 @@
|
||||||
|
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
|
|
||||||
bool irq_pm_check_wakeup(struct irq_desc *desc)
|
void irq_pm_handle_wakeup(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
if (irqd_is_wakeup_armed(&desc->irq_data)) {
|
irqd_clear(&desc->irq_data, IRQD_WAKEUP_ARMED);
|
||||||
irqd_clear(&desc->irq_data, IRQD_WAKEUP_ARMED);
|
desc->istate |= IRQS_SUSPENDED | IRQS_PENDING;
|
||||||
desc->istate |= IRQS_SUSPENDED | IRQS_PENDING;
|
desc->depth++;
|
||||||
desc->depth++;
|
irq_disable(desc);
|
||||||
irq_disable(desc);
|
pm_system_irq_wakeup(irq_desc_get_irq(desc));
|
||||||
pm_system_irq_wakeup(irq_desc_get_irq(desc));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue