On Wed, 13 Jul 2005 10:42:52 +0800 (CST)
gqbenjamin at 21cn.com wrote:

> Hi,
> 
> I use a device, like SMARTBITS, to test the Ethernet rate of mpc8250. The 
> kernel is linux-2.4.20
> with CONFIG_FCC_LXT971 and CONFIG_USE_MDIO, and do 'cat 
> "1">/proc/sys/net/ipv4/ip_forward'.
> 
> If the rate of sending IP packet been set too high, for example 100 Mbps Full 
> Duplex and each
> packet is 1514 Bytes. Later, the kernel print '... Memory squeeze, dropping 
> packet' on uart. Stop
> sending IP packet and do 'cat /proc/meminfo', the *MemFree* become small.
> 
> Try again, the *MemFree* become smaller, just look like some allocated memory 
> (skbuf) do not be
> free.
> 
> Final, the kernel break down, because all memory have been used.


It sounds to me like the problem may be that fcc_enet_rx() is consuming all the 
memory.  This
function is called in interrupt context and spins round the rx buffer 
descriptor ring until it finds
an empty buffer descriptor.  There is no check to stop it going round more than 
once and each time
it finds a BD it does a dev_alloc_skb().

It is possible that you are receiving data at a high enough rate that 
fcc_enet_rx() never exits.

What is more likely is that there isn't enough time between rx interrupts for 
the CPU to tx all the
queued packets.


> 
> Q. How can I do to let kernel do not break down? Is it a kernel promblem?
> 

This is just a guess, but... it may help to move fcc_enet_rx() from the 
interrupt handler to a
bottom half.  If you do this you should also ensure that it cannot process the 
rx buffer descriptor
ring more than once per call.  This may give the CPU *more* chance to tx queued 
packets by lowering
the rx priority a little.

I don't know if this would work but I'd be interested to find out.

Alex

Reply via email to