提交 60302ff6 编写于 作者: M Michael S. Tsirkin 提交者: David S. Miller

virtio: document queue state logic

commit d631b94e
    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: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 91bc4822
...@@ -939,11 +939,15 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -939,11 +939,15 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_orphan(skb); skb_orphan(skb);
nf_reset(skb); nf_reset(skb);
/* It is better to stop queue if running out of space /* If running out of space, stop queue to avoid getting packets that we
* instead of forcing queuing layer to requeue the skb * are then unable to transmit.
* by returning TX_BUSY (and cause a BUG message). * An alternative would be to force queuing layer to requeue the skb by
* Since most packets only take 1 or 2 ring slots * returning NETDEV_TX_BUSY. However, NETDEV_TX_BUSY should not be
* this means 16 slots are typically wasted. * 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) { if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
netif_stop_subqueue(dev, qnum); netif_stop_subqueue(dev, qnum);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册