lkml.org 
[lkml]   [1996]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: irqtune: improve serial port performance by 3x?


On Thu, 22 Aug 1996, Russell Berry wrote:
>
> I got this, installed it on both my machines (home/work), and can see a marked
> increase in ppp performance. However, I'm concerned about interrupt priorities,
> does this effect _ONLY_ the timer interrupt priorities, or does it actually tweak
> the way the kernel interprets all system interrupts???

I don't like the fact that irqtune helsp interrupt performance, because the
way Linux tries to handle interrupts it _shouldn't_ make a difference. The
fact that irqtune obviously _does_ make a difference would indicate that the
irq handling has some problem, and irqtune just masks that problem by
changing the interrupt priority levels.

Essentially, Linux does a "EOI" immediately when it gets the interrupt, and
that EOI _should_ mean that all other interrupts will get through, regardless
of whether they have lower or higher priority (because the EOI tells the
interrupt controller that it can forget about the interrupt that we're now
handling). As such there should be no effect from irqtune, because the
interrupt priorities shouldn't really matter.

However, Linux uses the "nonspecific" EOI to do this, and while that should
work, it may turn out that some interrupt controllers don't like it, and for
some reason mask the wrong interrupt. People who see a difference with
irqtune, could you test this patch instead (it changes the low-level
interrupt handlers to use the "specific" EOI to tell the controller that that
specific interrupt is now handled).

I'd be very interested in reactions to this patch indeed, can you please
try it out and tell me whether this makes any difference?

(This is against 2.0.14, but it should patch in cleanly against just about
any reasonably recent kernel. Certainly all of the 2.0.x series)

Linus
----
--- v2.0.14/linux/include/asm-i386/irq.h Sun Mar 10 09:28:56 1996
+++ linux/include/asm-i386/irq.h Fri Aug 23 08:18:12 1996
@@ -81,7 +81,7 @@
* a bit - without them it seems that the harddisk driver won't work on
* all hardware. Arghh.
*/
-#define ACK_FIRST(mask) \
+#define ACK_FIRST(mask,nr) \
"inb $0x21,%al\n\t" \
"jmp 1f\n" \
"1:\tjmp 1f\n" \
@@ -90,10 +90,10 @@
"outb %al,$0x21\n\t" \
"jmp 1f\n" \
"1:\tjmp 1f\n" \
- "1:\tmovb $0x20,%al\n\t" \
+ "1:\tmovb $0x60+"#nr",%al\n\t" \
"outb %al,$0x20\n\t"

-#define ACK_SECOND(mask) \
+#define ACK_SECOND(mask,nr) \
"inb $0xA1,%al\n\t" \
"jmp 1f\n" \
"1:\tjmp 1f\n" \
@@ -102,11 +102,12 @@
"outb %al,$0xA1\n\t" \
"jmp 1f\n" \
"1:\tjmp 1f\n" \
- "1:\tmovb $0x20,%al\n\t" \
+ "1:\tmovb $0x60+"#nr",%al\n\t" \
"outb %al,$0xA0\n\t" \
"jmp 1f\n" \
"1:\tjmp 1f\n" \
- "1:\toutb %al,$0x20\n\t"
+ "1:\tmovb $0x62,%al\n\t" \
+ "outb %al,$0x20\n\t"

#define UNBLK_FIRST(mask) \
"inb $0x21,%al\n\t" \
@@ -207,7 +208,7 @@
"pushl $-"#nr"-2\n\t" \
SAVE_ALL \
ENTER_KERNEL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
"sti\n\t" \
"movl %esp,%ebx\n\t" \
@@ -224,7 +225,7 @@
SYMBOL_NAME_STR(fast_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
ENTER_KERNEL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t" \
"pushl $" #nr "\n\t" \
"call "SYMBOL_NAME_STR(do_fast_IRQ)"\n\t" \
@@ -238,7 +239,7 @@
SYMBOL_NAME_STR(bad_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
ENTER_KERNEL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
LEAVE_KERNEL \
RESTORE_MOST);

@@ -255,7 +256,7 @@
"pushl $-"#nr"-2\n\t" \
SAVE_ALL \
ENTER_KERNEL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
"movl %esp,%ebx\n\t" \
"pushl %ebx\n\t" \
@@ -283,7 +284,7 @@
"pushl $-"#nr"-2\n\t" \
SAVE_ALL \
ENTER_KERNEL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
"sti\n\t" \
"movl %esp,%ebx\n\t" \
@@ -301,7 +302,7 @@
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(fast_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
SMP_PROF_IPI_CNT \
"pushl $" #nr "\n\t" \
"call "SYMBOL_NAME_STR(do_fast_IRQ)"\n\t" \
@@ -312,7 +313,7 @@
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(bad_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
RESTORE_MOST);

#define BUILD_RESCHEDIRQ(nr) \
@@ -345,7 +346,7 @@
SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \
"pushl $-"#nr"-2\n\t" \
SAVE_ALL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
"sti\n\t" \
"movl %esp,%ebx\n\t" \
@@ -360,7 +361,7 @@
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(fast_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t" \
"pushl $" #nr "\n\t" \
"call "SYMBOL_NAME_STR(do_fast_IRQ)"\n\t" \
@@ -372,7 +373,7 @@
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(bad_IRQ) #nr "_interrupt:\n\t" \
SAVE_MOST \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
RESTORE_MOST);

#define BUILD_TIMER_IRQ(chip,nr,mask) \
@@ -386,7 +387,7 @@
SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \
"pushl $-"#nr"-2\n\t" \
SAVE_ALL \
- ACK_##chip(mask) \
+ ACK_##chip(mask,(nr&7)) \
"incl "SYMBOL_NAME_STR(intr_count)"\n\t"\
"movl %esp,%ebx\n\t" \
"pushl %ebx\n\t" \
-----
\
 
 \ /
  Last update: 2005-03-22 13:38    [W:0.055 / U:1.188 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site