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

authored by Andreas Mohr and committed by Jeff Garzik 93ad4fb0 1e7f0bd8

+6 -4
+6 -4
drivers/net/pcmcia/pcnet_cs.c
··· 1155 1155 static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs) 1156 1156 { 1157 1157 struct net_device *dev = dev_id; 1158 - pcnet_dev_t *info = PRIV(dev); 1158 + pcnet_dev_t *info; 1159 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 1163 info->stale = 0; 1164 + } 1163 1165 return ret; 1164 1166 } 1165 1167 ··· 1352 1350 if (count & 0x01) 1353 1351 buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++; 1354 1352 1355 - /* This was for the ALPHA version only, but enough people have 1353 + /* This was for the ALPHA version only, but enough people have been 1356 1354 encountering problems that it is still here. */ 1357 1355 #ifdef PCMCIA_DEBUG 1358 1356 if (ei_debug > 4) { /* DMA termination address check... */ ··· 1426 1424 dma_start = jiffies; 1427 1425 1428 1426 #ifdef PCMCIA_DEBUG 1429 - /* This was for the ALPHA version only, but enough people have 1427 + /* This was for the ALPHA version only, but enough people have been 1430 1428 encountering problems that it is still here. */ 1431 1429 if (ei_debug > 4) { /* DMA termination address check... */ 1432 1430 int addr, tries = 20;