Thanks for your replying. I have resolved that problem. I found a bug in function *fcc_enet_start_xmit*. In linux-2.6.12 and linux-2.6.9, the bug had been patched by Dan Malek. In fcc_net.c of linux-2.6.5, at the end of *fcc_enet_start_xmit* :
if (bdp->cbd_sc & BD_ENET_TX_READY) { netif_stop_queue(dev); cep->tx_full = 1; } This cann't be used to decide TX-BD is full. If the rate of transmit is too high, the *skbuf* in TX-BD probably have not chance to be free befor a new one had been put in. So, memory been lost. > 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 ---------------------------------------------- vgo???????????????????????????? http://vgo.21cn.com ??????????????????4G?????? http://mail.21cn.com/huodong/0504/mail/ ??????????????!????????! http://qipai.g.21cn.com ?????????????????????? http://super.21cn.com/ ?????????????????????????? http://y.21cn.com/club/ ???????????????????????????? http://pas.21cn.com/ ??????2005???????????? http://callme.21cn.com