Messages in this thread Patch in this message | | | Subject | [PATCH 2/3] genirq: Do not consider the irqs with IRQF_NO_SUSPEND in check_wakeup_irqs() | From | Chuansheng Liu <> | Date | Tue, 12 Mar 2013 17:58:14 +0800 |
| |
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.liu@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
| |