netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: 2.6.2-rc2-mm2
       [not found] <20040130014108.09c964fd.akpm@osdl.org>
@ 2004-02-01 10:03 ` Michael Neuffer
  2004-02-06 23:17   ` of 2.6.2-rc2-mm2 and r8169 Francois Romieu
  0 siblings, 1 reply; 3+ messages in thread
From: Michael Neuffer @ 2004-02-01 10:03 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel, netdev, shuchen


Quoting Andrew Morton (akpm@osdl.org):
> [...] 
> +bk-netdev.patch
> 
>  Latest experimental netdev tree

The patch to r8169.c from the netdev patch clearly increases stability

The 2.6.2-rc2 kernel hangs within minutes even on very light load, whereas
2.6.2-rc2-mm2-1 holds up under heavy network traffic repeatably for
over half an hour before it hangs and somewhat longer under light traffic.

It is definitely the RTL-8169 interface since I can not get the kernel
to hang using a different (RTL-8139C) controller connected to the same 
Gigabit switch.

After many tests I was finally able to capture an Oops:
Oops: 0000 [#1]
PREEMPT
CPU:    0
EIP:    0060:[<c02f6a7a>]   Not tainted VLI
EFLAGS: 00010216
EIP is at rtl8169_rx_interrupt+0x7a/0x280
eax: 0000000f7  ebx: 3281c0f7   ecx: efcec200   edx: 00000000
esi: eecc2070   edi: 00000007   ebp: 000000f3   esp: e99a9fc2
ds: 007b   es: 007b   ss: 0068
Process setiathome (pid: 1817, threadinfo=e99a8000 task=e9a92240)
Stack: ed7d5600 efcec000 efcec000 e99a9f68 eecc2070 00000000 00000001 f3851000
       00000014 e99a8000 c02f6d62 efcec000 efcec200 f3851000 00000001 efcec200
       ef00ef00 04000001 00000000 e99a9fc4 c010e06a 00000013 efcec000 e99a9fc4
Call Trace:
 [<c02f6d62>] rtl8169_interrupt+0xe2/0xf0
 [<c010e06a>] handle_IRQ_event+0x3a/0x70
 [<c010e401>] do_IRQ+0x91/0x130
 [<c0491cdc>] common_interrupt+0x18/0x20

Code: 24 14 89 d8 25 ff 1f 00 00 8d 68 fc 3b 2d 38 12 58 c0 0f 8c 3f 01 00 00 8b
 4c 24 30 c7 84 b9 90 00 00 00 00 00 00 00 8b 54 24 14 <8b> 42 68 85 c0 0f 85 14
 01 00 00 8b 82 a0 00 00 00 01 6a 64 01
 <0>Kernel panic: Fatal exception in interrupt
In interrupt handler not syncing

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: of 2.6.2-rc2-mm2 and r8169
  2004-02-01 10:03 ` 2.6.2-rc2-mm2 Michael Neuffer
@ 2004-02-06 23:17   ` Francois Romieu
       [not found]     ` <20040207115054.GC5704@neuffer.info>
  0 siblings, 1 reply; 3+ messages in thread
From: Francois Romieu @ 2004-02-06 23:17 UTC (permalink / raw)
  To: Michael Neuffer; +Cc: linux-kernel, netdev, shuchen

Michael Neuffer <neuffer@neuffer.info> :
[...]
> After many tests I was finally able to capture an Oops:
> Oops: 0000 [#1]
> PREEMPT

If you need to see it work better, I would suggest to disable PREEMPT/SMP.

Could you send me the faulty r8169.o module off-list as well as an lsmod, an
output of the /proc/interrupts and a dmesg from boot ?

--
Ueimor

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [patch] [rft] Re: of 2.6.2-rc2-mm2 and r8169
       [not found]         ` <20040208064859.GA29384@neuffer.info>
@ 2004-02-09 23:57           ` Francois Romieu
  0 siblings, 0 replies; 3+ messages in thread
From: Francois Romieu @ 2004-02-09 23:57 UTC (permalink / raw)
  To: Michael Neuffer; +Cc: netdev

The patch below compiles but I don't know if it will apply against
current -mm. Complain if it's broken and I'll clean it once I have got some
sleep.

Idea behind the change: assume that there is no invocation of the r8169 irq
handler while the asic fills all the available rx buffers. When it is
finally called, the rx irq handler will not be stopped by a descriptor
which is owned by the r8169 asic. The skb refill logic is only called once
the handler has stopped looping over the ring and the rx handler will happily
process skb entries that were just NULLed -> Oops

--- drivers/net/r8169.c	2004-02-10 00:20:48.000000000 +0100
+++ drivers/net/r8169.c	2004-02-10 00:26:18.000000000 +0100
@@ -1471,17 +1471,20 @@ static void
 rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
 		     void *ioaddr)
 {
-	int cur_rx, delta;
+	int delta, rx_left;
 
 	assert(dev != NULL);
 	assert(tp != NULL);
 	assert(ioaddr != NULL);
 
-	cur_rx = tp->cur_rx % NUM_RX_DESC;
+	rx_left = tp->cur_rx - tp->dirty_rx;
 
-	while (!(le32_to_cpu(tp->RxDescArray[cur_rx].status) & OWNbit)) {
+	while (rx_left > 0) {
+		int cur_rx = tp->cur_rx % NUM_RX_DESC;
 		u32 status = le32_to_cpu(tp->RxDescArray[cur_rx].status);
 
+		if (status & OWNbit)
+			break;
 		if (status & RxRES) {
 			printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
 			tp->stats.rx_errors++;
@@ -1517,7 +1520,7 @@ rtl8169_rx_interrupt(struct net_device *
 		}
 		
 		tp->cur_rx++; 
-		cur_rx = tp->cur_rx % NUM_RX_DESC;
+		rx_left--;
 	}
 
 	delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-02-09 23:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20040130014108.09c964fd.akpm@osdl.org>
2004-02-01 10:03 ` 2.6.2-rc2-mm2 Michael Neuffer
2004-02-06 23:17   ` of 2.6.2-rc2-mm2 and r8169 Francois Romieu
     [not found]     ` <20040207115054.GC5704@neuffer.info>
     [not found]       ` <20040207132124.A7344@electric-eye.fr.zoreil.com>
     [not found]         ` <20040208064859.GA29384@neuffer.info>
2004-02-09 23:57           ` [patch] [rft] " Francois Romieu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).