diff options
-rw-r--r-- | include/linux/interrupt.h | 4 | ||||
-rw-r--r-- | kernel/irq/handle.c | 2 | ||||
-rw-r--r-- | kernel/irq/spurious.c | 4 |
3 files changed, 9 insertions, 1 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 80e63d8e9b15..f7b01b9a35b3 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -44,6 +44,9 @@ | |||
44 | * IRQF_TIMER - Flag to mark this interrupt as timer interrupt | 44 | * IRQF_TIMER - Flag to mark this interrupt as timer interrupt |
45 | * IRQF_PERCPU - Interrupt is per cpu | 45 | * IRQF_PERCPU - Interrupt is per cpu |
46 | * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing | 46 | * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing |
47 | * IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is | ||
48 | * registered first in an shared interrupt is considered for | ||
49 | * performance reasons) | ||
47 | */ | 50 | */ |
48 | #define IRQF_DISABLED 0x00000020 | 51 | #define IRQF_DISABLED 0x00000020 |
49 | #define IRQF_SAMPLE_RANDOM 0x00000040 | 52 | #define IRQF_SAMPLE_RANDOM 0x00000040 |
@@ -52,6 +55,7 @@ | |||
52 | #define IRQF_TIMER 0x00000200 | 55 | #define IRQF_TIMER 0x00000200 |
53 | #define IRQF_PERCPU 0x00000400 | 56 | #define IRQF_PERCPU 0x00000400 |
54 | #define IRQF_NOBALANCING 0x00000800 | 57 | #define IRQF_NOBALANCING 0x00000800 |
58 | #define IRQF_IRQPOLL 0x00001000 | ||
55 | 59 | ||
56 | /* | 60 | /* |
57 | * Migration helpers. Scheduled for removal in 9/2007 | 61 | * Migration helpers. Scheduled for removal in 9/2007 |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 515ad40bde15..32e1ab1477d1 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -180,6 +180,8 @@ fastcall unsigned int __do_IRQ(unsigned int irq) | |||
180 | if (desc->chip->ack) | 180 | if (desc->chip->ack) |
181 | desc->chip->ack(irq); | 181 | desc->chip->ack(irq); |
182 | action_ret = handle_IRQ_event(irq, desc->action); | 182 | action_ret = handle_IRQ_event(irq, desc->action); |
183 | if (!noirqdebug) | ||
184 | note_interrupt(irq, desc, action_ret); | ||
183 | desc->chip->end(irq); | 185 | desc->chip->end(irq); |
184 | return 1; | 186 | return 1; |
185 | } | 187 | } |
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c index 9d8c79b48823..b0d81aae472f 100644 --- a/kernel/irq/spurious.c +++ b/kernel/irq/spurious.c | |||
@@ -146,7 +146,9 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, | |||
146 | 146 | ||
147 | if (unlikely(irqfixup)) { | 147 | if (unlikely(irqfixup)) { |
148 | /* Don't punish working computers */ | 148 | /* Don't punish working computers */ |
149 | if ((irqfixup == 2 && irq == 0) || action_ret == IRQ_NONE) { | 149 | if ((irqfixup == 2 && ((irq == 0) || |
150 | (desc->action->flags & IRQF_IRQPOLL))) || | ||
151 | action_ret == IRQ_NONE) { | ||
150 | int ok = misrouted_irq(irq); | 152 | int ok = misrouted_irq(irq); |
151 | if (action_ret == IRQ_NONE) | 153 | if (action_ret == IRQ_NONE) |
152 | desc->irqs_unhandled -= ok; | 154 | desc->irqs_unhandled -= ok; |