Skip to content

Commit

Permalink
virtio-net: correct capacity math on ring full
Browse files Browse the repository at this point in the history
Capacity math on ring full is wrong: we are
looking at num_sg but that might be optimistic
because of indirect buffer use.

The implementation also penalizes fast path
with extra memory accesses for the benefit of
ring full condition handling which is slow path.

It's easy to query ring capacity so let's do just that.

This change also makes it easier to move vnet header
for tx around as follow-up patch does.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Michael S. Tsirkin authored and Rusty Russell committed Dec 18, 2012
1 parent 06ca287 commit 6ee57bc
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions drivers/net/virtio_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -557,10 +557,10 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
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) {
Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 6ee57bc

Please sign in to comment.