lkml.org 
[lkml]   [2013]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRE: [PATCH 2/3] genirq: Do not consider the irqs with IRQF_NO_SUSPEND in check_wakeup_irqs()
    Date
    Hello Thomas,

    Sorry to miss the V2 in the subject.
    I have updated the comments in this new patch, could you consider to take it into upstream?

    Thanks.

    Best Regards
    Liu chuansheng

    > -----Original Message-----
    > From: Liu, Chuansheng
    > Sent: Tuesday, March 12, 2013 5:58 PM
    > To: tglx@linutronix.de
    > Cc: mingo@redhat.com; linux-kernel@vger.kernel.org; Liu, Chuansheng
    > Subject: [PATCH 2/3] genirq: Do not consider the irqs with IRQF_NO_SUSPEND
    > in check_wakeup_irqs()
    >
    >
    > 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
    >
    >

    \
     
     \ /
      Last update: 2013-03-14 02:01    [W:2.594 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site