Messages in this thread | | | Date | Fri, 4 Jun 2010 23:46:59 +0200 (CEST) | From | Thomas Gleixner <> | Subject | Re: [RFC][PATCH] irq: support IRQ_NESTED_THREAD with non-threaded interrupt handlers |
| |
On Fri, 4 Jun 2010, Esben Haabendal wrote:
> set_irq_nested_thread() might be called by interrupt controller to > supported nested irq thread handling, and with this change, drivers > with non-threaded irq handlers can still use the irqs.
What's the problem you are trying to solve ? The above changelog is not very useful ?
Thanks,
tglx
> Signed-off-by: Esben Haabendal <eha@doredevelopment.dk> > --- > kernel/irq/chip.c | 9 ++++++++- > kernel/irq/manage.c | 4 +--- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c > index b7091d5..8202993 100644 > --- a/kernel/irq/chip.c > +++ b/kernel/irq/chip.c > @@ -405,7 +405,14 @@ void handle_nested_irq(unsigned int irq) > desc->status |= IRQ_INPROGRESS; > raw_spin_unlock_irq(&desc->lock); > > - action_ret = action->thread_fn(action->irq, action->dev_id); > + if (desc->status & IRQ_NESTED_THREAD && action->thread_fn) > + action_ret = action->thread_fn(action->irq, action->dev_id); > + else { > + local_irq_disable(); > + action_ret = action->handler(action->irq, action->dev_id); > + local_irq_enable(); > + } > + > if (!noirqdebug) > note_interrupt(irq, desc, action_ret); > > diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c > index 3164ba7..e7bca04 100644 > --- a/kernel/irq/manage.c > +++ b/kernel/irq/manage.c > @@ -681,10 +681,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) > * Check whether the interrupt nests into another interrupt > * thread. > */ > - nested = desc->status & IRQ_NESTED_THREAD; > + nested = (desc->status & IRQ_NESTED_THREAD) && new->thread_fn; > if (nested) { > - if (!new->thread_fn) > - return -EINVAL; > /* > * Replace the primary handler which was provided from > * the driver for non nested interrupt handling by the > -- > 1.7.1 > > >
| |