Patch "virtio-net: correctly enable callback during start_xmit" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    virtio-net: correctly enable callback during start_xmit

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     virtio-net-correctly-enable-callback-during-start_xm.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit da35da73e8b8d415d7dc7df559eb5792db0256f3
Author: Jason Wang <jasowang@xxxxxxxxxx>
Date:   Tue Jan 17 11:47:07 2023 +0800

    virtio-net: correctly enable callback during start_xmit
    
    [ Upstream commit d71ebe8114b4bf622804b810f5e274069060a174 ]
    
    Commit a7766ef18b33("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: a7766ef18b33 ("virtio_net: disable cb aggressively")
    Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx>
    Tested-by: Laurent Vivier <lvivier@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 48fb7bdc0f0b..9222be208aba 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1780,8 +1780,10 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
 	 */
 	if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {
 		netif_stop_subqueue(dev, qnum);
-		if (!use_napi &&
-		    unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {
+		if (use_napi) {
+			if (unlikely(!virtqueue_enable_cb_delayed(sq->vq)))
+				virtqueue_napi_schedule(&sq->napi, sq->vq);
+		} else if (unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {
 			/* More just got used, free them then recheck. */
 			free_old_xmit_skbs(sq, false);
 			if (sq->vq->num_free >= 2+MAX_SKB_FRAGS) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux