Hello Rusty, I think I have found a problem in the virtio network driver. virtio_net reclaims sent skbs on xmit. That means that there is always one skb outstanding and the netdev packet statistic is always one packet to low. Documentation/networking/drivers.txt says 3) Do not forget that once you return 0 from your hard_start_xmit method, it is your driver's responsibility to free up the SKB and in some finite amount of time. For example, this means that it is not allowed for your TX mitigation scheme to let TX packets "hang out" in the TX ring unreclaimed forever if no new TX packets are sent. This error can deadlock sockets waiting for send buffer room to be freed up. One solution would be to use the xmit_done interrupt. Unfortunately this would require additional locking as multiple interrupts can happen at two or more cpus. Do you have any better ideas? Christian
On Tue, 2007-08-21 at 10:48 +0200, Christian Borntraeger wrote:> Hello Rusty, > > I think I have found a problem in the virtio network driver. virtio_net > reclaims sent skbs on xmit. That means that there is always one skb > outstanding and the netdev packet statistic is always one packet to low.Hi Christian, Good catch!> One solution would be to use the xmit_done interrupt. Unfortunately this would > require additional locking as multiple interrupts can happen at two or more > cpus. Do you have any better ideas?The only reason that we don't do it in skb_xmit_done() is because kfree_skb() isn't supposed to be called from an interrupt. But there's dev_kfree_skb_any() which can be used. Cheers, Rusty.