---
 drivers/net/virtio_net.c |   43 +++++++++++++------------------------------
 1 file changed, 13 insertions(+), 30 deletions(-)

diff -r 6e11a22dac92 drivers/net/virtio_net.c
--- a/drivers/net/virtio_net.c	Thu May 15 13:34:19 2008 +1000
+++ b/drivers/net/virtio_net.c	Thu May 15 14:11:36 2008 +1000
@@ -40,9 +40,6 @@ struct virtnet_info
 	struct virtqueue *rvq, *svq;
 	struct net_device *dev;
 	struct napi_struct napi;
-
-	/* The skb we couldn't send because buffers were full. */
-	struct sk_buff *last_xmit_skb;
 
 	/* Number of input buffers, and max we've ever had. */
 	unsigned int num, max;
@@ -286,39 +283,25 @@ again:
 	/* Free up any pending old buffers before queueing new ones. */
 	free_old_xmit_skbs(vi);
 
-	/* If we has a buffer left over from last time, send it now. */
-	if (vi->last_xmit_skb) {
-		if (xmit_skb(vi, vi->last_xmit_skb) != 0) {
-			/* Drop this skb: we only queue one. */
-			vi->dev->stats.tx_dropped++;
-			kfree_skb(skb);
-			goto stop_queue;
-		}
-		vi->last_xmit_skb = NULL;
-	}
-
 	/* Put new one in send queue and do transmit */
 	__skb_queue_head(&vi->send, skb);
 	if (xmit_skb(vi, skb) != 0) {
-		vi->last_xmit_skb = skb;
-		goto stop_queue;
+		pr_debug("%s: virtio not prepared to send\n", dev->name);
+		netif_stop_queue(dev);
+
+		/* Activate callback for using skbs: if this returns false it
+		 * means some were used in the meantime. */
+		if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
+			vi->svq->vq_ops->disable_cb(vi->svq);
+			netif_start_queue(dev);
+			goto again;
+		}
+
+		__skb_unlink(skb, &vi->send);
+		return NETDEV_TX_BUSY;
 	}
-done:
 	vi->svq->vq_ops->kick(vi->svq);
 	return NETDEV_TX_OK;
-
-stop_queue:
-	pr_debug("%s: virtio not prepared to send\n", dev->name);
-	netif_stop_queue(dev);
-
-	/* Activate callback for using skbs: if this returns false it
-	 * means some were used in the meantime. */
-	if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
-		vi->svq->vq_ops->disable_cb(vi->svq);
-		netif_start_queue(dev);
-		goto again;
-	}
-	goto done;
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
