Re: [PATCH] virtio_net: free transmit skbs in a timer

From: Avi Kivity
Date: Tue May 13 2008 - 03:47:29 EST


Mark McLoughlin wrote:
virtio_net currently only frees old transmit skbs just
before queueing new ones. If the queue is full, it then
enables interrupts and waits for notification that more
work has been performed.

However, a side-effect of this scheme is that there are
always xmit skbs left dangling when no new packets are
sent, against the Documentation/networking/driver.txt
guideline:

"... 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."

Add a timer to ensure that any time we queue new TX
skbs, we will shortly free them again.

This fixes an easily reproduced hang at shutdown where
iptables attempts to unload nf_conntrack and nf_conntrack
waits for an skb it is tracking to be freed, but virtio_net
never frees it.

Sorry to barge in late, but IMO the timer should be on the host, which is cheaper than on the guest (well, a 100ms timer is likely zero cost, but I still don't like it).

the host should fire a tx completion interrupt whenever the completion queue has "enough" entries, where we can define "enough" now as the halfway mark or a timer expiry, whichever comes earlier.

We can later improve "enough" to be "just enough so the timer never triggers" and adjust it dynamically. It probably doesn't matter for Linux, but I don't want to punish guests that can do true async networking and depend on timely completion notification.

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/