aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch')
-rw-r--r--target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch b/target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch
new file mode 100644
index 0000000000..69bba053a7
--- /dev/null
+++ b/target/linux/layerscape/patches-4.4/7021-net-Make-the-netdev-watchdog-aware-of-hardware-multi.patch
@@ -0,0 +1,48 @@
+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
+@@ -290,8 +290,23 @@ static void dev_watchdog(unsigned long a
+ 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))) {