From 96504c28700902aa296085e6ccbfa8f18fd22d68 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Wed, 17 Feb 2016 16:05:10 +0000 Subject: [PATCH] IFF_NO_QUEUE: Fix for drivers not calling ether_setup() (regression in 4.3) --- debian/changelog | 1 + ...-for-drivers-not-calling-ether_setup.patch | 41 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 43 insertions(+) create mode 100644 debian/patches/bugfix/all/iff_no_queue-fix-for-drivers-not-calling-ether_setup.patch diff --git a/debian/changelog b/debian/changelog index 5befcf223..c6bf41457 100644 --- a/debian/changelog +++ b/debian/changelog @@ -36,6 +36,7 @@ linux (4.4.1-1) UNRELEASED; urgency=medium - [i386/686-pae] mm: Fix types used in pgprot cacheability flags translations - [i386/686-pae] PCI: Set pci=nobios by default + * IFF_NO_QUEUE: Fix for drivers not calling ether_setup() (regression in 4.3) [ Roger Shimizu ] * Enable TTY_PRINTK as module (Closes: #814540). diff --git a/debian/patches/bugfix/all/iff_no_queue-fix-for-drivers-not-calling-ether_setup.patch b/debian/patches/bugfix/all/iff_no_queue-fix-for-drivers-not-calling-ether_setup.patch new file mode 100644 index 000000000..defcd9602 --- /dev/null +++ b/debian/patches/bugfix/all/iff_no_queue-fix-for-drivers-not-calling-ether_setup.patch @@ -0,0 +1,41 @@ +From: Phil Sutter +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 +Signed-off-by: Phil Sutter +--- + 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; diff --git a/debian/patches/series b/debian/patches/series index 646e47c45..379f50e23 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -132,3 +132,4 @@ bugfix/x86/x86-efi-build-our-own-page-table-structures.patch bugfix/x86/x86-efi-setup-separate-efi-page-tables-in-kexec-path.patch bugfix/x86/x86-mm-fix-types-used-in-pgprot-cacheability-flags-t.patch debian/i386-686-pae-pci-set-pci-nobios-by-default.patch +bugfix/all/iff_no_queue-fix-for-drivers-not-calling-ether_setup.patch