diff options
author | Andreas Mohr <andi@rhlx01.fht-esslingen.de> | 2005-04-11 19:47:43 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-26 18:24:00 -0400 |
commit | 93ad4fb04f5dd82fe8ace1db7617c9dcb954cf60 (patch) | |
tree | ea30ca1f10063901325083e4ec059b576ae31186 | |
parent | 1e7f0bd8c8f2d0496ad338be5e69ff4395d77da4 (diff) |
[PATCH] pcnet_cs.c: IRQ handler optimization
During some performance diagnostics I stumbled on this slightly wasteful
code in pcnet_cs.c which I made the patch included at the bottom for (two
minor comment fixes included).
Improvement:
instead of *always* calculating
lea 0x2c0(%edx),%ebx
and then additionally doing the
mov %edx,0xc0(%ebx)
addition *if we need it*,
we now do the *whole* calculation of
mov %edx,0x380(%ebx)
*only* if we need it.
This even manages to save us a whole 16-byte alignment buffer loss
in this compilation case.
Result: slightly improves IRQ handler performance in both shared and
non-shared IRQ case, which should make my rusty P3/700 a slight bit happier.
Thank you for your support,
Andreas Mohr
old asm result (using gcc 3.3.5):
000015a0 <ei_irq_wrapper>:
15a0: 55 push %ebp
15a1: 89 e5 mov %esp,%ebp
15a3: 53 push %ebx
15a4: 8d 9a c0 02 00 00 lea 0x2c0(%edx),%ebx
15aa: e8 fc ff ff ff call 15ab <ei_irq_wrapper+0xb>
15af: 83 f8 01 cmp $0x1,%eax
15b2: 74 03 je 15b7 <ei_irq_wrapper+0x17>
15b4: 5b pop %ebx
15b5: 5d pop %ebp
15b6: c3 ret
15b7: 31 d2 xor %edx,%edx
15b9: 89 93 c0 00 00 00 mov %edx,0xc0(%ebx)
15bf: eb f3 jmp 15b4 <ei_irq_wrapper+0x14>
15c1: eb 0d jmp 15d0 <ei_watchdog>
15c3: 90 nop
15c4: 90 nop
15c5: 90 nop
15c6: 90 nop
15c7: 90 nop
15c8: 90 nop
15c9: 90 nop
15ca: 90 nop
15cb: 90 nop
15cc: 90 nop
15cd: 90 nop
15ce: 90 nop
15cf: 90 nop
000015d0 <ei_watchdog>:
new asm result:
000015a0 <ei_irq_wrapper>:
15a0: 55 push %ebp
15a1: 89 e5 mov %esp,%ebp
15a3: 53 push %ebx
15a4: 89 d3 mov %edx,%ebx
15a6: e8 fc ff ff ff call 15a7 <ei_irq_wrapper+0x7>
15ab: 83 f8 01 cmp $0x1,%eax
15ae: 74 03 je 15b3 <ei_irq_wrapper+0x13>
15b0: 5b pop %ebx
15b1: 5d pop %ebp
15b2: c3 ret
15b3: 31 d2 xor %edx,%edx
15b5: 89 93 80 03 00 00 mov %edx,0x380(%ebx)
15bb: eb f3 jmp 15b0 <ei_irq_wrapper+0x10>
15bd: 8d 76 00 lea 0x0(%esi),%esi
000015c0 <ei_watchdog>:
Signed-off-by: Andrew Morton <akpm@osdl.org>
-rw-r--r-- | drivers/net/pcmcia/pcnet_cs.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 181b6ed55003..f3ea4a9f2bf1 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -1155,11 +1155,13 @@ static int set_config(struct net_device *dev, struct ifmap *map) | |||
1155 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) | 1155 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) |
1156 | { | 1156 | { |
1157 | struct net_device *dev = dev_id; | 1157 | struct net_device *dev = dev_id; |
1158 | pcnet_dev_t *info = PRIV(dev); | 1158 | pcnet_dev_t *info; |
1159 | irqreturn_t ret = ei_interrupt(irq, dev_id, regs); | 1159 | irqreturn_t ret = ei_interrupt(irq, dev_id, regs); |
1160 | 1160 | ||
1161 | if (ret == IRQ_HANDLED) | 1161 | if (ret == IRQ_HANDLED) { |
1162 | info = PRIV(dev); | ||
1162 | info->stale = 0; | 1163 | info->stale = 0; |
1164 | } | ||
1163 | return ret; | 1165 | return ret; |
1164 | } | 1166 | } |
1165 | 1167 | ||
@@ -1350,7 +1352,7 @@ static void dma_block_input(struct net_device *dev, int count, | |||
1350 | if (count & 0x01) | 1352 | if (count & 0x01) |
1351 | buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++; | 1353 | buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++; |
1352 | 1354 | ||
1353 | /* This was for the ALPHA version only, but enough people have | 1355 | /* This was for the ALPHA version only, but enough people have been |
1354 | encountering problems that it is still here. */ | 1356 | encountering problems that it is still here. */ |
1355 | #ifdef PCMCIA_DEBUG | 1357 | #ifdef PCMCIA_DEBUG |
1356 | if (ei_debug > 4) { /* DMA termination address check... */ | 1358 | if (ei_debug > 4) { /* DMA termination address check... */ |
@@ -1424,7 +1426,7 @@ static void dma_block_output(struct net_device *dev, int count, | |||
1424 | dma_start = jiffies; | 1426 | dma_start = jiffies; |
1425 | 1427 | ||
1426 | #ifdef PCMCIA_DEBUG | 1428 | #ifdef PCMCIA_DEBUG |
1427 | /* This was for the ALPHA version only, but enough people have | 1429 | /* This was for the ALPHA version only, but enough people have been |
1428 | encountering problems that it is still here. */ | 1430 | encountering problems that it is still here. */ |
1429 | if (ei_debug > 4) { /* DMA termination address check... */ | 1431 | if (ei_debug > 4) { /* DMA termination address check... */ |
1430 | int addr, tries = 20; | 1432 | int addr, tries = 20; |