Virtual interfaces don't necessarily need a qdisc attached to them. This is signalled by setting dev->tx_queue_len to zero upon initialisation. The problems begin when a user still adds a qdisc, as then the special value is used as a regular one causing massive packet drops as soon as the device sees a bit of traffic load.
This patch solves the issue by setting tx_queue_len to the global default for physical devices if it is zero and a qdisc is added. Another benefit of this is that veth devices can default to noqueue while still preserving the expected behaviour when adding a qdisc. The drawback of this patch is that the noqueue state won't be restored after a user has removed the custom qdisc, as the information about whether this is legitimate for the given device is lost. Signed-off-by: Phil Sutter <p...@nwl.cc> --- net/sched/sch_api.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index f06aa01..79b8900 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -1315,6 +1315,10 @@ graft: qdisc_destroy(q); return err; } + /* circumvent noqueue hack for virtual interfaces if + * user desires to use a qdisc on it */ + if (!dev->tx_queue_len) + dev->tx_queue_len = CONFIG_DEFAULT_TX_QUEUE_LEN; return 0; } -- 2.1.2 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html