virtio: fix delayed xmit of packet and freeing of old packets.

Because we cache the last failed-to-xmit packet, if there are no
packets queued behind that one we may never send it (reproduced here
as TCP stalls, "cured" by an outgoing ping).

Mark McLoughlin also pointed out that we should not defer freeing used
xmit skbs indefinitely: he used a timer, but a tasklet on the xmit
interrupt is more appropriate here.

(Note: we could try to grab the xmit lock from the xmit_done interrupt
and if successful use dev_kfree_skb_any to free the skbs.  It's
unlikely to be much more efficient, and we'd still have to fall back
to a tasklet if we can't get the lock, as xmit could just be finishing).

Cc: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 drivers/net/virtio_net.c |   30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff -r c1d09eff85a1 drivers/net/virtio_net.c
--- a/drivers/net/virtio_net.c	Tue May 06 21:18:01 2008 +1000
+++ b/drivers/net/virtio_net.c	Thu May 08 13:05:38 2008 +1000
@@ -48,6 +48,9 @@ struct virtnet_info
 	/* Number of input buffers, and max we've ever had. */
 	unsigned int num, max;
 
+	/* For cleaning up after transmission. */
+	struct tasklet_struct tasklet;
+
 	/* Receive & send queues. */
 	struct sk_buff_head recv;
 	struct sk_buff_head send;
@@ -66,11 +69,21 @@ static void skb_xmit_done(struct virtque
 static void skb_xmit_done(struct virtqueue *svq)
 {
 	struct virtnet_info *vi = svq->vdev->priv;
+	bool qstopped;
 
 	/* Suppress further interrupts. */
 	svq->vq_ops->disable_cb(svq);
-	/* We were waiting for more output buffers. */
-	netif_wake_queue(vi->dev);
+
+	/* Were we waiting for more output buffers? */
+	qstopped = netif_queue_stopped(vi->dev);
+	if (qstopped)
+		netif_wake_queue(vi->dev);
+
+	/* We might be stopped, but not have anything more to send, except for
+	 * that last_xmit_skb we failed last time.  Or we might not be stopped,
+	 * but we should be polite and free xmitted skbs. */
+	if (!qstopped || vi->last_xmit_skb)
+		tasklet_schedule(&vi->tasklet);
 }
 
 static void receive_skb(struct net_device *dev, struct sk_buff *skb,
@@ -304,6 +317,17 @@ static int xmit_skb(struct virtnet_info 
 	return vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb);
 }
 
+static void xmit_tasklet(unsigned long data)
+{
+	struct virtnet_info *vi = (void *)data;
+
+	netif_tx_lock_bh(vi->dev);
+	free_old_xmit_skbs(vi);
+	if (vi->last_xmit_skb && xmit_skb(vi, vi->last_xmit_skb) == 0)
+		vi->last_xmit_skb = NULL;
+	netif_tx_unlock_bh(vi->dev);
+}
+
 static int start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct virtnet_info *vi = netdev_priv(dev);
@@ -477,6 +501,8 @@ static int virtnet_probe(struct virtio_d
 	skb_queue_head_init(&vi->recv);
 	skb_queue_head_init(&vi->send);
 
+	tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi);
+
 	err = register_netdev(dev);
 	if (err) {
 		pr_debug("virtio_net: registering device failed\n");
