diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9fab6545859bdb7c1dae86133aada3cb34ea5eec..b3d591397ba2b35420baecf369e4f078990dfa5f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -629,7 +629,6 @@ static void __free_old_xmit(struct send_queue *sq, struct netdev_queue *txq, break; } } - netdev_tx_completed_queue(txq, stats->napi_packets, stats->napi_bytes); } static void virtnet_free_old_xmit(struct send_queue *sq, @@ -3210,7 +3209,7 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget) return 0; } -static int xmit_skb(struct send_queue *sq, struct sk_buff *skb, bool orphan) +static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) { struct virtio_net_hdr_mrg_rxbuf *hdr; const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; @@ -3255,8 +3254,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb, bool orphan) num_sg++; } - return virtnet_add_outbuf(sq, num_sg, skb, - orphan ? VIRTNET_XMIT_TYPE_SKB_ORPHAN : VIRTNET_XMIT_TYPE_SKB); + return virtnet_add_outbuf(sq, num_sg, skb, VIRTNET_XMIT_TYPE_SKB); } static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -3266,9 +3264,8 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) struct send_queue *sq = &vi->sq[qnum]; int err; struct netdev_queue *txq = netdev_get_tx_queue(dev, qnum); - bool xmit_more = netdev_xmit_more(); + bool kick = !netdev_xmit_more(); bool use_napi = sq->napi.weight; - bool kick; /* Free up any pending old buffers before queueing new ones. */ do { @@ -3277,14 +3274,14 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) free_old_xmit(sq, txq, false); - } while (use_napi && !xmit_more && + } while (use_napi && kick && unlikely(!virtqueue_enable_cb_delayed(sq->vq))); /* timestamp packet in software */ skb_tx_timestamp(skb); /* Try to transmit */ - err = xmit_skb(sq, skb, !use_napi); + err = xmit_skb(sq, skb); /* This should not happen! */ if (unlikely(err)) { @@ -3306,9 +3303,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) check_sq_full_and_disable(vi, dev, sq); - kick = use_napi ? __netdev_tx_sent_queue(txq, skb->len, xmit_more) : - !xmit_more || netif_xmit_stopped(txq); - if (kick) { + if (kick || netif_xmit_stopped(txq)) { if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) { u64_stats_update_begin(&sq->stats.syncp); u64_stats_inc(&sq->stats.kicks); @@ -6270,10 +6265,6 @@ static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf) static void virtnet_sq_free_unused_buf_done(struct virtqueue *vq) { - struct virtnet_info *vi = vq->vdev->priv; - int i = vq2txq(vq); - - netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); } static void free_unused_bufs(struct virtnet_info *vi) @@ -7013,20 +7004,11 @@ static int virtnet_probe(struct virtio_device *vdev) static void remove_vq_common(struct virtnet_info *vi) { - int i; - virtio_reset_device(vi->vdev); /* Free unused buffers in both send and recv, if any. */ free_unused_bufs(vi); - /* - * Rule of thumb is netdev_tx_reset_queue() should follow any - * skb freeing not followed by netdev_tx_completed_queue() - */ - for (i = 0; i < vi->max_queue_pairs; i++) - netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); - free_receive_bufs(vi); free_receive_page_frags(vi);