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/

Reply via email to