virtio: document queue state logic
Subsystems (4)
Michael S. Tsirkin
maintainerPATCH 1/1 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.
---
drivers/net/virtio_net.c +9 -5
@@ -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);
PATCH 1/1 netdevice: document NETDEV_TX_BUSY deprecation.
This paraphrases DaveM (and steals some of his words) explaining why a device shouldn't return NETDEV_TX_BUSY, even though it looks so inviting to driver authors.
See http://www.spinics.net/lists/netdev/msg322350.html
include/linux/netdevice.h +4 -1
@@ -795,7 +795,10 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,* netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, * struct net_device *dev); * Called when a packet needs to be transmitted. -* Must return NETDEV_TX_OK , NETDEV_TX_BUSY. +* Returns NETDEV_TX_OK. Can return NETDEV_TX_BUSY, but you should stop +* the queue before that can happen; it's for obsolete devices and weird +* corner cases, but the stack really does a non-trivial amount +* of useless work if you return NETDEV_TX_BUSY. * (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX) * Required can not be NULL. *
PATCH 1/1 netdevice: document NETDEV_TX_BUSY deprecation.
In reply to Michael S. TsirkinThis paraphrases DaveM (and steals some of his words) explaining why a device shouldn't return NETDEV_TX_BUSY, even though it looks so inviting to driver authors.
See http://www.spinics.net/lists/netdev/msg322350.html
include/linux/netdevice.h +4 -1
@@ -795,7 +795,10 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,* netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, * struct net_device *dev); * Called when a packet needs to be transmitted. -* Must return NETDEV_TX_OK , NETDEV_TX_BUSY. +* Returns NETDEV_TX_OK. Can return NETDEV_TX_BUSY, but you should stop +* the queue before that can happen; it's for obsolete devices and weird +* corner cases, but the stack really does a non-trivial amount +* of useless work if you return NETDEV_TX_BUSY. * (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX) * Required can not be NULL. *
Re: [PATCH net-next] netdevice: document NETDEV_TX_BUSY deprecation.
From: Rusty Russell <[email protected]>
Date: Fri, 03 Apr 2015 22:17:17 +1030
Quoted 8 lines
This paraphrases DaveM (and steals some of his words) explaining why a device shouldn't return
NETDEV_TX_BUSY, even though it looks so inviting to driver authors.See http://www.spinics.net/lists/netdev/msg322350.html
Inspired-by David Miller <[email protected]>Signed-off-by Rusty Russell <[email protected]>
Applied.
Re: [PATCH net-next] netdevice: document NETDEV_TX_BUSY deprecation.
In reply to Rusty RussellFrom: Rusty Russell <[email protected]>
Date: Fri, 03 Apr 2015 22:17:17 +1030
Quoted 8 lines
This paraphrases DaveM (and steals some of his words) explaining why a device shouldn't return
NETDEV_TX_BUSY, even though it looks so inviting to driver authors.See http://www.spinics.net/lists/netdev/msg322350.html
Inspired-by David Miller <[email protected]>Signed-off-by Rusty Russell <[email protected]>
Applied.
From: "Michael S. Tsirkin" <[email protected]>
Date: Thu, 2 Apr 2015 13:05:47 +0200
Quoted 10 lines
commit
d631b94e7a15277858ec5f88d674d93080506999
virtio: change comment in transmitstarted clarifying the logic behind queue state management, but introduced an inaccuracy:
TX_BUSYdoes not cause a BUG message.Clean this up some more, explaining the tradeoffs in detail.
Signed-off-by Michael S. Tsirkin <[email protected]>
Applied, thanks Michael.
From: "Michael S. Tsirkin" <[email protected]>
Date: Thu, 2 Apr 2015 13:05:47 +0200
Quoted 10 lines
commit
d631b94e7a15277858ec5f88d674d93080506999
virtio: change comment in transmitstarted clarifying the logic behind queue state management, but introduced an inaccuracy:
TX_BUSYdoes not cause a BUG message.Clean this up some more, explaining the tradeoffs in detail.
Signed-off-by Michael S. Tsirkin <[email protected]>
Applied, thanks Michael.