On Wed, 2007-11-28 at 15:38 +0100, Remy Bohmer wrote:The later I think .. Yeah, it's clear there needs to be an unmask for this special case.. I've attached a patch which only handles the special case.. Could you test/review it.. No .. I wouldn't comment about an company specific tree. I was talking about the broken out real time patches. Daniel -------- Remove the IRQ_PENDING flag if it's asserted, and unmask the irq. Also loop around to account for the pending interrupt. Signed-Off-By: Daniel Walker <dwalker@mvista.com> --- kernel/irq/manage.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) Index: linux-2.6.23/kernel/irq/manage.c =================================================================== --- linux-2.6.23.orig/kernel/irq/manage.c +++ linux-2.6.23/kernel/irq/manage.c @@ -646,7 +646,7 @@ __setup("hardirq-preempt=", hardirq_pree /* * threaded simple handler */ -static void thread_simple_irq(irq_desc_t *desc) +static void thread_core_irq(irq_desc_t *desc) { struct irqaction *action = desc->action; unsigned int irq = desc - irq_desc; @@ -664,13 +664,35 @@ static void thread_simple_irq(irq_desc_t } /* + * threaded fasteoi type irq handler + */ +static void thread_simple_irq(irq_desc_t *desc) +{ + unsigned int irq = desc - irq_desc; + + do { + /* + * When another irq arrived while we were handling + * one, we could have masked the irq. + * Renable it, if it was not disabled in meantime. + */ + if (unlikely(desc->status & IRQ_PENDING)) { + desc->status &= ~IRQ_PENDING; + desc->chip->unmask(irq); + } + thread_core_irq(desc); + } while ((desc->status & (IRQ_PENDING | IRQ_INPROGRESS))); + +} + +/* * threaded level type irq handler */ static void thread_level_irq(irq_desc_t *desc) { unsigned int irq = desc - irq_desc; - thread_simple_irq(desc); + thread_core_irq(desc); if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) desc->chip->unmask(irq); } @@ -682,7 +704,7 @@ static void thread_fasteoi_irq(irq_desc_ { unsigned int irq = desc - irq_desc; - thread_simple_irq(desc); + thread_core_irq(desc); if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) desc->chip->unmask(irq); } -
| Zach Brown | [PATCH 3 of 4] Teach paths to wake a specific void * target instead of a whole tas... |
| Linus Torvalds | Re: LSM conversion to static interface |
| Greg Kroah-Hartman | [PATCH 001/196] Chinese: Add the known_regression URI to the HOWTO |
| Andrew Morton | -mm merge plans for 2.6.23 |
git: | |
| Gregory Haskins | [RFC PATCH 00/17] virtual-bus |
| David Miller | [GIT]: Networking |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
