Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 830a8a97 authored by Shirley Ma's avatar Shirley Ma Committed by David S. Miller
Browse files

virtio_net: remove send queue



Now we have a virtio detach API (in commit
f9bfbebf), we don't need to track xmit
skbs in the virio_net driver, which improves transmission performance.

Signed-off-by: default avatarShirley Ma <xma@us.ibm.com>
Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b25822ca
Loading
Loading
Loading
Loading
+8 −18
Original line number Original line Diff line number Diff line
@@ -56,9 +56,6 @@ struct virtnet_info
	/* Host will merge rx buffers for big packets (shake it! shake it!) */
	/* Host will merge rx buffers for big packets (shake it! shake it!) */
	bool mergeable_rx_bufs;
	bool mergeable_rx_bufs;


	/* Send queue. */
	struct sk_buff_head send;

	/* Work struct for refilling if we run low on memory. */
	/* Work struct for refilling if we run low on memory. */
	struct delayed_work refill;
	struct delayed_work refill;


@@ -505,7 +502,6 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)


	while ((skb = vi->svq->vq_ops->get_buf(vi->svq, &len)) != NULL) {
	while ((skb = vi->svq->vq_ops->get_buf(vi->svq, &len)) != NULL) {
		pr_debug("Sent skb %p\n", skb);
		pr_debug("Sent skb %p\n", skb);
		__skb_unlink(skb, &vi->send);
		vi->dev->stats.tx_bytes += skb->len;
		vi->dev->stats.tx_bytes += skb->len;
		vi->dev->stats.tx_packets++;
		vi->dev->stats.tx_packets++;
		tot_sgs += skb_vnet_hdr(skb)->num_sg;
		tot_sgs += skb_vnet_hdr(skb)->num_sg;
@@ -588,15 +584,6 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
	}
	}
	vi->svq->vq_ops->kick(vi->svq);
	vi->svq->vq_ops->kick(vi->svq);


	/*
	 * Put new one in send queue.  You'd expect we'd need this before
	 * xmit_skb calls add_buf(), since the callback can be triggered
	 * immediately after that.  But since the callback just triggers
	 * another call back here, normal network xmit locking prevents the
	 * race.
	 */
	__skb_queue_head(&vi->send, skb);

	/* Don't wait up for transmitted skbs to be freed. */
	/* Don't wait up for transmitted skbs to be freed. */
	skb_orphan(skb);
	skb_orphan(skb);
	nf_reset(skb);
	nf_reset(skb);
@@ -980,9 +967,6 @@ static int virtnet_probe(struct virtio_device *vdev)
			dev->features |= NETIF_F_HW_VLAN_FILTER;
			dev->features |= NETIF_F_HW_VLAN_FILTER;
	}
	}


	/* Initialize our empty send queue. */
	skb_queue_head_init(&vi->send);

	err = register_netdev(dev);
	err = register_netdev(dev);
	if (err) {
	if (err) {
		pr_debug("virtio_net: registering device failed\n");
		pr_debug("virtio_net: registering device failed\n");
@@ -1018,6 +1002,12 @@ static int virtnet_probe(struct virtio_device *vdev)
static void free_unused_bufs(struct virtnet_info *vi)
static void free_unused_bufs(struct virtnet_info *vi)
{
{
	void *buf;
	void *buf;
	while (1) {
		buf = vi->svq->vq_ops->detach_unused_buf(vi->svq);
		if (!buf)
			break;
		dev_kfree_skb(buf);
	}
	while (1) {
	while (1) {
		buf = vi->rvq->vq_ops->detach_unused_buf(vi->rvq);
		buf = vi->rvq->vq_ops->detach_unused_buf(vi->rvq);
		if (!buf)
		if (!buf)
@@ -1038,11 +1028,11 @@ static void __devexit virtnet_remove(struct virtio_device *vdev)
	/* Stop all the virtqueues. */
	/* Stop all the virtqueues. */
	vdev->config->reset(vdev);
	vdev->config->reset(vdev);


	/* Free our skbs in send queue, if any. */
	__skb_queue_purge(&vi->send);


	unregister_netdev(vi->dev);
	unregister_netdev(vi->dev);
	cancel_delayed_work_sync(&vi->refill);
	cancel_delayed_work_sync(&vi->refill);

	/* Free unused buffers in both send and recv, if any. */
	free_unused_bufs(vi);
	free_unused_bufs(vi);


	vdev->config->del_vqs(vi->vdev);
	vdev->config->del_vqs(vi->vdev);