Messages in this thread Patch in this message |  | | Date | Sun, 10 Dec 2006 08:35:45 -0800 | From | Daniel Walker <> | Subject | [PATCH -rt][RESEND] fix preempt hardirqs on OMAP |
| |
This should fix hardirq threading when the chained handler disables an interrupt while setting IRQ_PENDING. Which happens on ARM OMAP. It also has the effect of re-running the interrupt on IRQ_PENDING, which would normally be handled inside the chained handler. Since this happens inside a thread the chained handler will just wake up the thread multiple times, leaving the thread to actually rerun the interrupt.
Signed-Off-By: Daniel Walker <dwalker@mvista.com>
--- kernel/irq/manage.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+)
Index: linux-2.6.19/kernel/irq/manage.c =================================================================== --- linux-2.6.19.orig/kernel/irq/manage.c +++ linux-2.6.19/kernel/irq/manage.c @@ -546,6 +546,7 @@ static void thread_simple_irq(irq_desc_t unsigned int irq = desc - irq_desc; irqreturn_t action_ret; +restart: if (action && !desc->depth) { spin_unlock(&desc->lock); action_ret = handle_IRQ_event(irq, action); @@ -555,6 +556,19 @@ static void thread_simple_irq(irq_desc_t if (!noirqdebug) note_interrupt(irq, desc, action_ret); } + + /* + * Some boards will disable an interrupt when it + * sets IRQ_PENDING . So we have to remove the flag + * and re-enable to handle it. + */ + if (desc->status & IRQ_PENDING) { + desc->status &= ~IRQ_PENDING; + if (desc->chip) + desc->chip->enable(irq); + goto restart; + } + desc->status &= ~IRQ_INPROGRESS; } -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |