summaryrefslogtreecommitdiff
path: root/net/sched
diff options
context:
space:
mode:
authorBogdan Hamciuc <bogdan.hamciuc@freescale.com>2012-09-28 14:04:33 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-04-08 23:09:15 (GMT)
commit20c2598fa3fc19fbf282fa0613a2d381855221ea (patch)
treec7e5f3a71179ee36f1dd11f6ed6511681c48c409 /net/sched
parentde8c106ba5a8b6afc496b018a1a604ba8a29e55a (diff)
downloadlinux-fsl-qoriq-20c2598fa3fc19fbf282fa0613a2d381855221ea.tar.xz
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>
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/sch_generic.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 5d81a44..b6d80d7 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -238,8 +238,23 @@ static void dev_watchdog(unsigned long arg)
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))) {