]> Pileus Git - ~andy/linux/blobdiff - drivers/net/virtio_net.c
virtio-net: correct capacity math on ring full
[~andy/linux] / drivers / net / virtio_net.c
index cbf8b06253528e9e5557c31e844581d7334d7e21..3db65867895be0e9fad6de1fe8ff1f8e46c8e134 100644 (file)
@@ -557,10 +557,10 @@ again:
        return received;
 }
 
-static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
+static void free_old_xmit_skbs(struct virtnet_info *vi)
 {
        struct sk_buff *skb;
-       unsigned int len, tot_sgs = 0;
+       unsigned int len;
        struct virtnet_stats *stats = this_cpu_ptr(vi->stats);
 
        while ((skb = virtqueue_get_buf(vi->svq, &len)) != NULL) {
@@ -571,10 +571,8 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)
                stats->tx_packets++;
                u64_stats_update_end(&stats->tx_syncp);
 
-               tot_sgs += skb_vnet_hdr(skb)->num_sg;
                dev_kfree_skb_any(skb);
        }
-       return tot_sgs;
 }
 
 static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
@@ -664,7 +662,8 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
                netif_stop_queue(dev);
                if (unlikely(!virtqueue_enable_cb_delayed(vi->svq))) {
                        /* More just got used, free them then recheck. */
-                       capacity += free_old_xmit_skbs(vi);
+                       free_old_xmit_skbs(vi);
+                       capacity = vi->svq->num_free;
                        if (capacity >= 2+MAX_SKB_FRAGS) {
                                netif_start_queue(dev);
                                virtqueue_disable_cb(vi->svq);