Network TX/RX fairness is not honored by USB stack
pyunyh at gmail.com
Sat Oct 2 00:40:36 UTC 2010
I don't know how long it had been there but it seems current USB
stack does not honor fairness of TX/RX on USB ethernet controller.
Unidirectional performance test(UDP) or most-unidirectional
performance(TCP) test works well without problems. However if heavy
TX/RX traffic hits controller at the same time either TX or RX is
not served at all. I'm under the impression that whenever TX work
is done it seems USB reschedules next pending TX again instead of
processing RX such that RX is starved to death. This can be easily
reproduced on two hosts with the netperf performance test.
Whenever both hosts send tiny UDP datagrams to the other host
either TX or RX packet counters are not increasing until the end
of the UDP torture test. The number of EHCI interrupt is about 8K/s
while test is in progress so I think it reached its maximum
processing limit. After netperf testing, it can still process TX/RX
packets even though it dropped too many RX packets. But these
dropped packets are not counted so netstat(1) shows 0 dropped
frames even though it lost millions of packets.
Hans, do you have any idea what's going on here?
You can use the following netperf command on both hosts after
%netperf -c -H ip_addr_of_other_host -tUDP_STREAM -l 300 -- -m 1
Another odd thing I noticed is number of interrupts does not go
down to 0 after the testing. It constantly generates 1k/s
interrupts after that. The only way I stop that interrupts was to
down the ue0 interface with "ifconfig ue0 down" command.
More information about the freebsd-usb