lkml.org 
[lkml]   [2014]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [RFC][PATCH] irq: Rework IRQF_NO_SUSPENDED
On Fri, Jul 25, 2014 at 11:40:48AM +0200, Thomas Gleixner wrote:
> On Thu, 24 Jul 2014, Peter Zijlstra wrote:
> > @@ -29,14 +29,20 @@ void suspend_device_irqs(void)
> > for_each_irq_desc(irq, desc) {
> > unsigned long flags;
> >
> > + /*
> > + * Ideally this would be a global state, but we cannot
> > + * for the trainwreck that is IRQD_WAKEUP_STATE.
> > + */
> > raw_spin_lock_irqsave(&desc->lock, flags);
> > - __disable_irq(desc, irq, true);
> > + if (!irqd_has_set(&desc->irq_data, IRQD_WAKEUP_STATE))
> > + desc->istate |= IRQS_SUSPENDED;
> > raw_spin_unlock_irqrestore(&desc->lock, flags);
> > }
> >
> > - for_each_irq_desc(irq, desc)
> > + for_each_irq_desc(irq, desc) {
> > if (desc->istate & IRQS_SUSPENDED)
> > synchronize_irq(irq);
> > + }
> > }
>
> So, instead of disabling the interrupt you just mark it
> suspended. Good luck with level triggered interrupt lines then.
>
> Assume the interrupt fires after you marked it suspended. Then the
> flow handler will call handle_irq_event() which will do nothing and
> return handled. So the flow handler will reenable the interrupt line,
> which will cause the interrupt to fire immediately again after the
> RETI. Guess how much progress the system is going to make when that
> happens.

Urgh, right. I knew it was too easy. Can we have do_irqhandler() ACK the
interrupt and not call the handler?


\
 
 \ /
  Last update: 2014-07-25 16:21    [W:0.161 / U:0.600 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site