[PATCH] Fix alignment of i386 interrupt entry stubs

From: Brian Gerst (bgerst@didntduck.org)
Date: Fri May 02 2003 - 09:24:43 EST


This patch provides for improved alignment of the entry stubs, to avoid
crossing cache lines. This is accomplished by using a fixed size for
each stub (16 bytes for IO-APIC, 8 bytes otherwise). The fixed size
allows for removal of the pointer table. Also, subtracting 256 from the
irq number is no longer necessary. orig_eax is no longer used by the
exit code to distinguish between interrupts and system calls.

--
				Brian Gerst

diff -ur linux-2.5.68-bk/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S --- linux-2.5.68-bk/arch/i386/kernel/entry.S 2003-04-07 13:30:58.000000000 -0400 +++ linux/arch/i386/kernel/entry.S 2003-04-30 10:36:53.000000000 -0400 @@ -374,27 +374,17 @@ movl $-ENOSYS,EAX(%esp) jmp resume_userspace -/* - * Build the entry stubs and pointer table with - * some assembler magic. - */ -.data -ENTRY(interrupt) -.text - +/* Build the IRQ entry stubs */ vector=0 -ENTRY(irq_entries_start) + .align IRQ_STUB_SIZE,0x90 +ENTRY(irq_entries) .rept NR_IRQS - ALIGN -1: pushl $vector-256 +1: pushl $vector jmp common_interrupt -.data - .long 1b -.text + .align IRQ_STUB_SIZE,0x90 vector=vector+1 .endr - ALIGN common_interrupt: SAVE_ALL call do_IRQ diff -ur linux-2.5.68-bk/arch/i386/kernel/i8259.c linux/arch/i386/kernel/i8259.c --- linux-2.5.68-bk/arch/i386/kernel/i8259.c 2003-04-30 11:35:36.000000000 -0400 +++ linux/arch/i386/kernel/i8259.c 2003-04-30 10:04:52.000000000 -0400 @@ -425,7 +425,7 @@ for (i = 0; i < NR_IRQS; i++) { int vector = FIRST_EXTERNAL_VECTOR + i; if (vector != SYSCALL_VECTOR) - set_intr_gate(vector, interrupt[i]); + set_intr_gate(vector, &irq_entries[i]); } /* setup after call gates are initialised (usually add in diff -ur linux-2.5.68-bk/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c --- linux-2.5.68-bk/arch/i386/kernel/io_apic.c 2003-04-30 11:35:36.000000000 -0400 +++ linux/arch/i386/kernel/io_apic.c 2003-04-30 10:04:52.000000000 -0400 @@ -1190,7 +1190,7 @@ else irq_desc[irq].handler = &ioapic_edge_irq_type; - set_intr_gate(vector, interrupt[irq]); + set_intr_gate(vector, &irq_entries[irq]); if (!apic && (irq < 16)) disable_8259A_irq(irq); @@ -2024,7 +2024,7 @@ */ disable_8259A_irq(0); vector = assign_irq_vector(0); - set_intr_gate(vector, interrupt[0]); + set_intr_gate(vector, &irq_entries[0]); /* * Subtle, code in do_timer_interrupt() expects an AEOI @@ -2312,7 +2312,7 @@ irq_desc[irq].handler = &ioapic_level_irq_type; - set_intr_gate(entry.vector, interrupt[irq]); + set_intr_gate(entry.vector, &irq_entries[irq]); if (!ioapic && (irq < 16)) disable_8259A_irq(irq); diff -ur linux-2.5.68-bk/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- linux-2.5.68-bk/arch/i386/kernel/irq.c 2003-04-30 11:35:36.000000000 -0400 +++ linux/arch/i386/kernel/irq.c 2003-04-30 10:04:52.000000000 -0400 @@ -354,7 +354,7 @@ * 0 return value means that this irq is already being * handled by some other CPU. (or is disabled) */ - int irq = regs.orig_eax & 0xff; /* high bits used in ret_from_ code */ + int irq = regs.orig_eax; int cpu = smp_processor_id(); irq_desc_t *desc = irq_desc + irq; struct irqaction * action; diff -ur linux-2.5.68-bk/arch/i386/kernel/smpboot.c linux/arch/i386/kernel/smpboot.c --- linux-2.5.68-bk/arch/i386/kernel/smpboot.c 2003-04-20 05:13:04.000000000 -0400 +++ linux/arch/i386/kernel/smpboot.c 2003-04-30 10:04:52.000000000 -0400 @@ -1159,7 +1159,7 @@ * IRQ0 must be given a fixed assignment and initialized, * because it's used before the IO-APIC is set up. */ - set_intr_gate(FIRST_DEVICE_VECTOR, interrupt[0]); + set_intr_gate(FIRST_DEVICE_VECTOR, &irq_entries[0]); /* * The reschedule interrupt is a CPU-to-CPU reschedule-helper diff -ur linux-2.5.68-bk/include/asm-i386/hw_irq.h linux/include/asm-i386/hw_irq.h --- linux-2.5.68-bk/include/asm-i386/hw_irq.h 2003-04-07 13:32:58.000000000 -0400 +++ linux/include/asm-i386/hw_irq.h 2003-04-30 10:35:55.000000000 -0400 @@ -27,7 +27,7 @@ extern int irq_vector[NR_IRQS]; #define IO_APIC_VECTOR(irq) irq_vector[irq] -extern void (*interrupt[NR_IRQS])(void); +extern char irq_entries[NR_IRQS][IRQ_STUB_SIZE]; #ifdef CONFIG_SMP extern asmlinkage void reschedule_interrupt(void); diff -ur linux-2.5.68-bk/include/asm-i386/mach-default/irq_vectors.h linux/include/asm-i386/mach-default/irq_vectors.h --- linux-2.5.68-bk/include/asm-i386/mach-default/irq_vectors.h 2003-04-20 05:13:14.000000000 -0400 +++ linux/include/asm-i386/mach-default/irq_vectors.h 2003-04-30 10:33:52.000000000 -0400 @@ -78,8 +78,10 @@ */ #ifdef CONFIG_X86_IO_APIC #define NR_IRQS 224 +#define IRQ_STUB_SIZE 16 #else #define NR_IRQS 16 +#define IRQ_STUB_SIZE 8 #endif #define FPU_IRQ 13 diff -ur linux-2.5.68-bk/include/asm-i386/mach-pc9800/irq_vectors.h linux/include/asm-i386/mach-pc9800/irq_vectors.h --- linux-2.5.68-bk/include/asm-i386/mach-pc9800/irq_vectors.h 2003-04-20 05:13:14.000000000 -0400 +++ linux/include/asm-i386/mach-pc9800/irq_vectors.h 2003-04-30 10:34:06.000000000 -0400 @@ -78,8 +78,10 @@ */ #ifdef CONFIG_X86_IO_APIC #define NR_IRQS 224 +#define IRQ_STUB_SIZE 16 #else #define NR_IRQS 16 +#define IRQ_STUB_SIZE 8 #endif #define FPU_IRQ 8 diff -ur linux-2.5.68-bk/include/asm-i386/mach-visws/irq_vectors.h linux/include/asm-i386/mach-visws/irq_vectors.h --- linux-2.5.68-bk/include/asm-i386/mach-visws/irq_vectors.h 2003-04-20 05:13:14.000000000 -0400 +++ linux/include/asm-i386/mach-visws/irq_vectors.h 2003-04-30 10:34:12.000000000 -0400 @@ -50,6 +50,7 @@ * */ #define NR_IRQS 224 +#define IRQ_STUB_SIZE 16 #define FPU_IRQ 13 diff -ur linux-2.5.68-bk/include/asm-i386/mach-voyager/irq_vectors.h linux/include/asm-i386/mach-voyager/irq_vectors.h --- linux-2.5.68-bk/include/asm-i386/mach-voyager/irq_vectors.h 2003-04-20 05:13:14.000000000 -0400 +++ linux/include/asm-i386/mach-voyager/irq_vectors.h 2003-04-30 10:34:17.000000000 -0400 @@ -56,6 +56,7 @@ #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) #define NR_IRQS 224 +#define IRQ_STUB_SIZE 16 #define FPU_IRQ 13

- 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/



This archive was generated by hypermail 2b29 : Wed May 07 2003 - 22:00:15 EST