diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-12-17 07:16:08 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-17 07:16:08 -0500 |
commit | 948a7b2b5e2bf126fb697aeb11ff379b2c85dd2e (patch) | |
tree | 727c744438a44d85f7dc340b1bfcb3b127c84f13 /kernel/irq/handle.c | |
parent | 9466d6036f73481104039fbe99338baed11c8fea (diff) | |
parent | 17483a1f34c970e6c2cb8c082d4441bfabbe88a9 (diff) |
Merge branch 'irq/sparseirq' into cpus4096
Conflicts:
arch/x86/kernel/io_apic.c
Merge irq/sparseirq here, to resolve conflicts.
Diffstat (limited to 'kernel/irq/handle.c')
-rw-r--r-- | kernel/irq/handle.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 8aa09547f5ef..f1a23069c20a 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
@@ -23,7 +23,7 @@ | |||
23 | /* | 23 | /* |
24 | * lockdep: we want to handle all irq_desc locks as a single lock-class: | 24 | * lockdep: we want to handle all irq_desc locks as a single lock-class: |
25 | */ | 25 | */ |
26 | static struct lock_class_key irq_desc_lock_class; | 26 | struct lock_class_key irq_desc_lock_class; |
27 | 27 | ||
28 | /** | 28 | /** |
29 | * handle_bad_irq - handle spurious and unhandled irqs | 29 | * handle_bad_irq - handle spurious and unhandled irqs |
@@ -73,7 +73,7 @@ static struct irq_desc irq_desc_init = { | |||
73 | #endif | 73 | #endif |
74 | }; | 74 | }; |
75 | 75 | ||
76 | static void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) | 76 | void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) |
77 | { | 77 | { |
78 | unsigned long bytes; | 78 | unsigned long bytes; |
79 | char *ptr; | 79 | char *ptr; |
@@ -113,7 +113,7 @@ static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) | |||
113 | /* | 113 | /* |
114 | * Protect the sparse_irqs: | 114 | * Protect the sparse_irqs: |
115 | */ | 115 | */ |
116 | static DEFINE_SPINLOCK(sparse_irq_lock); | 116 | DEFINE_SPINLOCK(sparse_irq_lock); |
117 | 117 | ||
118 | struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly; | 118 | struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly; |
119 | 119 | ||
@@ -337,8 +337,11 @@ unsigned int __do_IRQ(unsigned int irq) | |||
337 | /* | 337 | /* |
338 | * No locking required for CPU-local interrupts: | 338 | * No locking required for CPU-local interrupts: |
339 | */ | 339 | */ |
340 | if (desc->chip->ack) | 340 | if (desc->chip->ack) { |
341 | desc->chip->ack(irq); | 341 | desc->chip->ack(irq); |
342 | /* get new one */ | ||
343 | desc = irq_remap_to_desc(irq, desc); | ||
344 | } | ||
342 | if (likely(!(desc->status & IRQ_DISABLED))) { | 345 | if (likely(!(desc->status & IRQ_DISABLED))) { |
343 | action_ret = handle_IRQ_event(irq, desc->action); | 346 | action_ret = handle_IRQ_event(irq, desc->action); |
344 | if (!noirqdebug) | 347 | if (!noirqdebug) |
@@ -349,8 +352,10 @@ unsigned int __do_IRQ(unsigned int irq) | |||
349 | } | 352 | } |
350 | 353 | ||
351 | spin_lock(&desc->lock); | 354 | spin_lock(&desc->lock); |
352 | if (desc->chip->ack) | 355 | if (desc->chip->ack) { |
353 | desc->chip->ack(irq); | 356 | desc->chip->ack(irq); |
357 | desc = irq_remap_to_desc(irq, desc); | ||
358 | } | ||
354 | /* | 359 | /* |
355 | * REPLAY is when Linux resends an IRQ that was dropped earlier | 360 | * REPLAY is when Linux resends an IRQ that was dropped earlier |
356 | * WAITING is used by probe to mark irqs that are being tested | 361 | * WAITING is used by probe to mark irqs that are being tested |