aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2015-04-02 07:05:47 -0400
committerDavid S. Miller <davem@davemloft.net>2015-04-06 16:44:24 -0400
commit60302ff631f0f3eac0ec592e128b776f0676b397 (patch)
tree2dabf60760cf7e12d0d40bce8e332f375de22ba5
parent91bc4822c3d61b9bb7ef66d3b77948a4f9177954 (diff)
virtio: document queue state logic
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>
-rw-r--r--drivers/net/virtio_net.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index a829930dac15..63c7810e1545 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -939,11 +939,15 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
939 skb_orphan(skb); 939 skb_orphan(skb);
940 nf_reset(skb); 940 nf_reset(skb);
941 941
942 /* It is better to stop queue if running out of space 942 /* If running out of space, stop queue to avoid getting packets that we
943 * instead of forcing queuing layer to requeue the skb 943 * are then unable to transmit.
944 * by returning TX_BUSY (and cause a BUG message). 944 * An alternative would be to force queuing layer to requeue the skb by
945 * Since most packets only take 1 or 2 ring slots 945 * returning NETDEV_TX_BUSY. However, NETDEV_TX_BUSY should not be
946 * this means 16 slots are typically wasted. 946 * returned in a normal path of operation: it means that driver is not
947 * maintaining the TX queue stop/start state properly, and causes
948 * the stack to do a non-trivial amount of useless work.
949 * Since most packets only take 1 or 2 ring slots, stopping the queue
950 * early means 16 slots are typically wasted.
947 */ 951 */
948 if (sq->vq->num_free < 2+MAX_SKB_FRAGS) { 952 if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
949 netif_stop_subqueue(dev, qnum); 953 netif_stop_subqueue(dev, qnum);