Skip to content

Commit 1b426c6

Browse files
committed
virtio-net: correctly enable callback during start_xmit
jira LE-2741 Rebuild_History Non-Buildable kernel-4.18.0-553.42.1.el8_10 commit-author Jason Wang <[email protected]> commit d71ebe8 Commit a7766ef("virtio_net: disable cb aggressively") enables virtqueue callback via the following statement: do { if (use_napi) virtqueue_disable_cb(sq->vq); free_old_xmit_skbs(sq, false); } while (use_napi && kick && unlikely(!virtqueue_enable_cb_delayed(sq->vq))); When NAPI is used and kick is false, the callback won't be enabled here. And when the virtqueue is about to be full, the tx will be disabled, but we still don't enable tx interrupt which will cause a TX hang. This could be observed when using pktgen with burst enabled. TO be consistent with the logic that tries to disable cb only for NAPI, fixing this by trying to enable delayed callback only when NAPI is enabled when the queue is about to be full. Fixes: a7766ef ("virtio_net: disable cb aggressively") Signed-off-by: Jason Wang <[email protected]> Tested-by: Laurent Vivier <[email protected]> Signed-off-by: David S. Miller <[email protected]> (cherry picked from commit d71ebe8) Signed-off-by: Jonathan Maple <[email protected]>
1 parent 0c492a6 commit 1b426c6

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/net/virtio_net.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,8 +1750,10 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
17501750
*/
17511751
if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
17521752
netif_stop_subqueue(dev, qnum);
1753-
if (!use_napi &&
1754-
unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {
1753+
if (use_napi) {
1754+
if (unlikely(!virtqueue_enable_cb_delayed(sq->vq)))
1755+
virtqueue_napi_schedule(&sq->napi, sq->vq);
1756+
} else if (unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {
17551757
/* More just got used, free them then recheck. */
17561758
free_old_xmit_skbs(sq, false);
17571759
if (sq->vq->num_free >= 2+MAX_SKB_FRAGS) {

0 commit comments

Comments
 (0)