diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-10-04 05:16:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 10:55:29 -0400 |
commit | 550f2299ac8ffaba943cf211380d3a8d3fa75301 (patch) | |
tree | 9a8cb7b0d62f48f581f66ab4951aa6c9793131c0 /arch/x86_64/kernel/i8259.c | |
parent | e500f57436b9056a245216c53113613928155eba (diff) |
[PATCH] genirq: x86_64 irq: make vector_irq per cpu
This refactors the irq handling code to make the vectors a per cpu resource so
the same vector number can be simultaneously used on multiple cpus for
different irqs.
This should make systems that were hitting limits on the total number of irqs
much more livable.
[akpm@osdl.org: build fix]
[akpm@osdl.org: __target_IO_APIC_irq is unneeded on UP]
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rajesh Shah <rajesh.shah@intel.com>
Cc: Andi Kleen <ak@muc.de>
Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64/kernel/i8259.c')
-rw-r--r-- | arch/x86_64/kernel/i8259.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c index bddde431871a..0612a33bb896 100644 --- a/arch/x86_64/kernel/i8259.c +++ b/arch/x86_64/kernel/i8259.c | |||
@@ -394,7 +394,7 @@ device_initcall(i8259A_init_sysfs); | |||
394 | */ | 394 | */ |
395 | 395 | ||
396 | static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL}; | 396 | static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL}; |
397 | int vector_irq[NR_VECTORS] __read_mostly = { | 397 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { |
398 | [0 ... FIRST_EXTERNAL_VECTOR - 1] = -1, | 398 | [0 ... FIRST_EXTERNAL_VECTOR - 1] = -1, |
399 | [FIRST_EXTERNAL_VECTOR + 0] = 0, | 399 | [FIRST_EXTERNAL_VECTOR + 0] = 0, |
400 | [FIRST_EXTERNAL_VECTOR + 1] = 1, | 400 | [FIRST_EXTERNAL_VECTOR + 1] = 1, |
@@ -520,7 +520,7 @@ void __init init_IRQ(void) | |||
520 | * IRQ0 must be given a fixed assignment and initialized, | 520 | * IRQ0 must be given a fixed assignment and initialized, |
521 | * because it's used before the IO-APIC is set up. | 521 | * because it's used before the IO-APIC is set up. |
522 | */ | 522 | */ |
523 | vector_irq[FIRST_DEVICE_VECTOR] = 0; | 523 | __get_cpu_var(vector_irq)[FIRST_DEVICE_VECTOR] = 0; |
524 | 524 | ||
525 | /* | 525 | /* |
526 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper | 526 | * The reschedule interrupt is a CPU-to-CPU reschedule-helper |