According to commit 9c6079aa1bf(genirq: Do not consider disabled wakeup irqs), we should not break the suspend when one interrupt has been disabled before suspending and is pending there.
But there is another case missed: If an interrupt which is marked IRQF_NO_SUSPEND has been disabled before suspend invocation then desc->depth is 1 and therefor it should not be checked for IRQS_PENDING in check_wakeup_irqs(). Here also checking if the desc->istate & IRQS_SUSPENDED is true to avoid this case. Signed-off-by: liu chuansheng <chuansheng....@intel.com> --- kernel/irq/pm.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c index cb228bf..f02a03d 100644 --- a/kernel/irq/pm.c +++ b/kernel/irq/pm.c @@ -107,9 +107,16 @@ int check_wakeup_irqs(void) * Only interrupts which are marked as wakeup source * and have not been disabled before the suspend check * can abort suspend. + * + * Meanwhile, if an interrupt which is marked IRQF_NO_SUSPEND + * has been disabled before suspend invocation then + * desc->depth is 1 and therefor it should not be checked + * for IRQS_PENDING, so also adding the checking of + * desc->istate & IRQS_SUSPENDED for this case. */ if (irqd_is_wakeup_set(&desc->irq_data)) { - if (desc->depth == 1 && desc->istate & IRQS_PENDING) + if (desc->depth == 1 && (desc->istate & IRQS_PENDING) + && (desc->istate & IRQS_SUSPENDED)) return -EBUSY; continue; } -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/