]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
virtio: document queue state logic
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 2 Apr 2015 11:05:47 +0000 (13:05 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 Apr 2015 20:44:24 +0000 (16:44 -0400)
commit d631b94e7a15277858ec5f88d674d93080506999
    virtio: change comment in transmit

started clarifying the logic behind queue state management,
but introduced an inaccuracy: TX_BUSY does not cause
a BUG message.

Clean this up some more, explaining the tradeoffs in detail.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/virtio_net.c

index a829930dac150e2910629f4d918b3dca3b493e8a..63c7810e1545a357eda7578af862ed18322de933 100644 (file)
@@ -939,11 +939,15 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
        skb_orphan(skb);
        nf_reset(skb);
 
-       /* It is better to stop queue if running out of space
-        * instead of forcing queuing layer to requeue the skb
-        * by returning TX_BUSY (and cause a BUG message).
-        * Since most packets only take 1 or 2 ring slots
-        * this means 16 slots are typically wasted.
+       /* If running out of space, stop queue to avoid getting packets that we
+        * are then unable to transmit.
+        * An alternative would be to force queuing layer to requeue the skb by
+        * returning NETDEV_TX_BUSY. However, NETDEV_TX_BUSY should not be
+        * returned in a normal path of operation: it means that driver is not
+        * maintaining the TX queue stop/start state properly, and causes
+        * the stack to do a non-trivial amount of useless work.
+        * Since most packets only take 1 or 2 ring slots, stopping the queue
+        * early means 16 slots are typically wasted.
         */
        if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
                netif_stop_subqueue(dev, qnum);