123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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))) {
|