2.1.51: Tracking an infinite loop in networking

sinster@darkwater.com
Sat, 23 Aug 1997 15:08:37 -0700 (PDT)


-----BEGIN PGP SIGNED MESSAGE-----

I'm running 2.1.51. I've got a network lockup that happens between 10 and 40
hours after boot, irregularly.

This is not an oops. This is a the typical kernel-allocates-memory-until-
the-system-runs-slower-than-tar partial lockup (SysRq-M and other simple
SysRq commands work).

What happens is that the networking code gets stuck in a loop somewhere,
allocating network buffers (dunno yet if it is alloc_skb() or skb_copy()).
After 5 hours the machine is running so slowly that not even SysRq-M works.
I've got the kernel rigged to oops if I ever have more than 100 network
buffers allocated at a time (generally I never get above 20).

I have CONFIG_SYN_COOKIES on, but I never get a message from it, so I doubt
I'm getting SYN-flooded.

Does anyone have any ideas?

The only difference between my kernel and naked 2.1.51 is the printk()'s I've
spread around, the new oops code, and a simple patch to make parport_pc.c
compile cleanly (attached to the end of this message). My machine is an
i586 120, I'm using an SMC Elite16 Combo. My only network connection is
through 10Base2, which eventually leads to a Sun 3/160 running PPP over
a 28.8Kbps modem to the rest of the world. The overwhelming majority of
network packets sent to my machine are sent by the Sun, but there's nothing
in the logs there to give me a clue.

- --- linux/drivers/misc/parport_pc.c.orig Fri Aug 22 15:09:23 1997
+++ linux/drivers/misc/parport_pc.c Sat Aug 23 15:07:24 1997
@@ -38,6 +38,8 @@

#define PC_MAX_PORTS 8

+#define NO_PARPORT_DMA
+
static void pc_null_intr_func(int irq, void *dev_id, struct pt_regs *regs)
{
/* NULL function - Does nothing */
@@ -236,6 +238,7 @@
/******************************************************
* DMA detection section:
*/
+#ifndef NO_PARPORT_DMA

/*
* Prepare DMA channels from 0-8 to transmit towards buffer
@@ -322,7 +325,6 @@
return dma;
}

- -#if 0
/* Only called if port supports ECP mode.
*
* The only restriction on DMA channels is that it has to be
@@ -827,9 +829,13 @@
}
if (p->irq != PARPORT_IRQ_NONE)
printk(", irq %d", p->irq);
- - if (p->dma == PARPORT_DMA_AUTO)
+ if (p->dma == PARPORT_DMA_AUTO)
+#ifdef NO_PARPORT_DMA
+ p->dma = PARPORT_DMA_NONE;
+#else
p->dma = (p->modes & PARPORT_MODE_PCECP)?
parport_dma_probe(p):PARPORT_DMA_NONE;
+#endif
if (p->dma != PARPORT_DMA_NONE)
printk(", dma %d", p->dma);
printk(" [");
- --
Jon Paul Nollmann ne' Darren Senn sinster@darkwater.com
POBox 64132, Sunnyvale, CA, USA 94088-4132
Unsolicited commercial email will be archived at $1/byte/day.
The only one who'll defend your rights is yourself.

-----BEGIN PGP SIGNATURE-----
Version: 2.6.2

iQCVAwUBM/9fTcyyNwVEgVztAQEQiAP+LxIsI68vp5MGrtebrSX/ZRELFyGY+lAo
+m87xplHGciCGe4dT9MA0I/091bD3tzWtkY3OFge51C3V7a/yCQoNjPpSC9BDCYF
cVqR75POIBDeVaKPilweu0EmjnX0ynyk216832O22lrnD99AHjiH2KpXEmwBytOs
n109FheQWeY=
=odAK
-----END PGP SIGNATURE-----