Please CC me.
Setup:
ucLinux 2.4.10 based kernel running on a embedded
processor (coldfire) with 40 MIPS processing
capablity.
Problem:
This embedded system sends relatively huge amount of
data (~1.5MB/s) over ethernet to a remote system which
process the data. On a normal case it all works great.
But when there is a lot of traffic on the network
(simulated by running flood ping between two desktop
linux systems connected to the same hub as this
embedded system), embedded systems Linux TCP/IP stack
go haywire.
More details:
Since there is a high traffic on the network, the
embedded system cannot transmit packet and this
triggers tcp retransmit in the stack.
But the first check on the tcp_transmit_skb fails
if (atomic_read(&sk->wmem_alloc) > min_t(int,
sk->wmem_queued+(sk->wmem_queued>>2),sk->sndbuf))
return -EAGAIN
When conditions fails, the value of wmem_alloc is ~
around 56K-154K, sndbuf = 64K and wmem_queued is
around 44K.
Each time it tries to retransmit this if condition
always fail and the whole transmission times out.
Once this retransmission phase kicks in, even if the
ping flooding is stopped , tcp stack never recovers.
This happens only on the send path of tcp never on the
receive path.
Any hints in helping me debug this issue will be
appreciated.
Thanks
Venkatesh
__________________________________________________
Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!
http://sbc.yahoo.com
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/