Patch "net/sched: adjust device watchdog timer to detect stopped queue at right time" has been added to the 6.1-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

    net/sched: adjust device watchdog timer to detect stopped queue at right time

to the 6.1-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:
     net-sched-adjust-device-watchdog-timer-to-detect-sto.patch
and it can be found in the queue-6.1 subdirectory.

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



commit bde764eabf47948525f388a54af5c6eb5ff90ac0
Author: Praveen Kumar Kannoju <praveen.kannoju@xxxxxxxxxx>
Date:   Wed May 8 19:06:17 2024 +0530

    net/sched: adjust device watchdog timer to detect stopped queue at right time
    
    [ Upstream commit 33fb988b67050d9bb512f77f08453fa00088943c ]
    
    Applications are sensitive to long network latency, particularly
    heartbeat monitoring ones. Longer the tx timeout recovery higher the
    risk with such applications on a production machines. This patch
    remedies, yet honoring device set tx timeout.
    
    Modify watchdog next timeout to be shorter than the device specified.
    Compute the next timeout be equal to device watchdog timeout less the
    how long ago queue stop had been done. At next watchdog timeout tx
    timeout handler is called into if still in stopped state. Either called
    or not called, restore the watchdog timeout back to device specified.
    
    Signed-off-by: Praveen Kumar Kannoju <praveen.kannoju@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240508133617.4424-1-praveen.kannoju@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Stable-dep-of: 95ecba62e2fd ("net: fix races in netdev_tx_sent_queue()/dev_watchdog()")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 6ab9359c1706f..7f0c8df7b63e0 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -505,19 +505,22 @@ static void dev_watchdog(struct timer_list *t)
 			unsigned int timedout_ms = 0;
 			unsigned int i;
 			unsigned long trans_start;
+			unsigned long oldest_start = jiffies;
 
 			for (i = 0; i < dev->num_tx_queues; i++) {
 				struct netdev_queue *txq;
 
 				txq = netdev_get_tx_queue(dev, i);
 				trans_start = READ_ONCE(txq->trans_start);
-				if (netif_xmit_stopped(txq) &&
-				    time_after(jiffies, (trans_start +
-							 dev->watchdog_timeo))) {
+				if (!netif_xmit_stopped(txq))
+					continue;
+				if (time_after(jiffies, trans_start + dev->watchdog_timeo)) {
 					timedout_ms = jiffies_to_msecs(jiffies - trans_start);
 					atomic_long_inc(&txq->trans_timeout);
 					break;
 				}
+				if (time_after(oldest_start, trans_start))
+					oldest_start = trans_start;
 			}
 
 			if (unlikely(timedout_ms)) {
@@ -530,7 +533,7 @@ static void dev_watchdog(struct timer_list *t)
 				netif_unfreeze_queues(dev);
 			}
 			if (!mod_timer(&dev->watchdog_timer,
-				       round_jiffies(jiffies +
+				       round_jiffies(oldest_start +
 						     dev->watchdog_timeo)))
 				release = false;
 		}




[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