42 lines
1.6 KiB
Diff
42 lines
1.6 KiB
Diff
From: Phil Sutter <phil@nwl.cc>
|
|
Date: Wed, 17 Feb 2016 15:37:43 +0100
|
|
Subject: IFF_NO_QUEUE: Fix for drivers not calling ether_setup()
|
|
Origin: http://mid.gmane.org/1455719863-25730-1-git-send-email-phil@nwl.cc
|
|
|
|
My implementation around IFF_NO_QUEUE driver flag assumed that leaving
|
|
tx_queue_len untouched (specifically: not setting it to zero) by drivers
|
|
would make it possible to assign a regular qdisc to them without having
|
|
to worry about setting tx_queue_len to a useful value. This was only
|
|
partially true: I overlooked that some drivers don't call ether_setup()
|
|
and therefore not initialize tx_queue_len to the default value of 1000.
|
|
Consequently, removing the workarounds in place for that case in qdisc
|
|
implementations which cared about it (namely, pfifo, bfifo, gred, htb,
|
|
plug and sfb) leads to problems with these specific interface types and
|
|
qdiscs.
|
|
|
|
Luckily, there's already a sanitization point for drivers setting
|
|
tx_queue_len to zero, which can be reused to assign the fallback value
|
|
most qdisc implementations used, which is 1.
|
|
|
|
Fixes: 348e3435cbefa ("net: sched: drop all special handling of tx_queue_len == 0")
|
|
Tested-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
---
|
|
net/core/dev.c | 4 +++-
|
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -7125,8 +7125,10 @@ struct net_device *alloc_netdev_mqs(int
|
|
dev->priv_flags = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM;
|
|
setup(dev);
|
|
|
|
- if (!dev->tx_queue_len)
|
|
+ if (!dev->tx_queue_len) {
|
|
dev->priv_flags |= IFF_NO_QUEUE;
|
|
+ dev->tx_queue_len = 1;
|
|
+ }
|
|
|
|
dev->num_tx_queues = txqs;
|
|
dev->real_num_tx_queues = txqs;
|