2016-10-28 16:14:32 +00:00
|
|
|
From 6aa1eca98ca44f515e10d8058d0ff6db3c8a3c11 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
|
|
|
|
Date: Fri, 28 Sep 2012 17:04:33 +0300
|
|
|
|
Subject: [PATCH 21/70] net: Make the netdev watchdog aware of hardware
|
|
|
|
multiqueue devices
|
|
|
|
|
|
|
|
If the netdev declares the NETIF_F_HW_ACCEL_MQ (accelerated multiqueue)
|
|
|
|
capability, tell the watchdog to consider the per-netdev trans_start
|
|
|
|
field rather than any individual multiqueue's timestamp. That is
|
|
|
|
justified by the fact that queues only go in and out of congestion
|
|
|
|
in groups, not individually, as far as the net device is concerned.
|
|
|
|
|
|
|
|
Change-Id: I07a6693bf1f0bb1e9396c5e232452223a511ecc1
|
|
|
|
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@freescale.com>
|
|
|
|
Reviewed-on: http://git.am.freescale.net:8181/1033
|
|
|
|
Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
|
|
|
|
Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
|
|
|
|
---
|
|
|
|
net/sched/sch_generic.c | 17 ++++++++++++++++-
|
|
|
|
1 file changed, 16 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
--- a/net/sched/sch_generic.c
|
|
|
|
+++ b/net/sched/sch_generic.c
|
2016-12-11 08:41:34 +00:00
|
|
|
@@ -334,8 +334,23 @@ static void dev_watchdog(unsigned long a
|
2016-10-28 16:14:32 +00:00
|
|
|
txq = netdev_get_tx_queue(dev, i);
|
|
|
|
/*
|
|
|
|
* old device drivers set dev->trans_start
|
|
|
|
+ *
|
|
|
|
+ * (Actually, not only "old" devices, but also
|
|
|
|
+ * those which perform queue management in a
|
|
|
|
+ * separate hw accelerator. So even though the
|
|
|
|
+ * net device itself is single-queued, it makes
|
|
|
|
+ * sense (and is safe, too) to use kernel's
|
|
|
|
+ * multiqueue interface, specifically to avoid
|
|
|
|
+ * unnecessary device locking in SMP systems.
|
|
|
|
+ * In this case, we ought to consider not an
|
|
|
|
+ * individual txq's timestamp as a congestion
|
|
|
|
+ * indicator, but the "old" per-netdev field.)
|
|
|
|
*/
|
|
|
|
- trans_start = txq->trans_start ? : dev->trans_start;
|
|
|
|
+ if (dev->features & NETIF_F_HW_ACCEL_MQ)
|
|
|
|
+ trans_start = dev->trans_start;
|
|
|
|
+ else
|
|
|
|
+ trans_start = txq->trans_start ? :
|
|
|
|
+ dev->trans_start;
|
|
|
|
if (netif_xmit_stopped(txq) &&
|
|
|
|
time_after(jiffies, (trans_start +
|
|
|
|
dev->watchdog_timeo))) {
|