On Fri, 2016-07-08 at 13:07 +0200, Thomas Graf wrote: > On 07/07/16 at 10:36pm, Jiri Kosina wrote: > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > > index f45929c..630838e 100644 > > --- a/include/linux/netdevice.h > > +++ b/include/linux/netdevice.h > > @@ -52,6 +52,7 @@ > > #include <uapi/linux/netdevice.h> > > #include <uapi/linux/if_bonding.h> > > #include <uapi/linux/pkt_cls.h> > > +#include <linux/hashtable.h> > > > > struct netpoll_info; > > struct device; > > @@ -1778,6 +1779,7 @@ struct net_device { > > unsigned int num_tx_queues; > > unsigned int real_num_tx_queues; > > struct Qdisc *qdisc; > > + DECLARE_HASHTABLE (qdisc_hash, 16); > > This blows up net_device to an insane size: 64K * sizeof(struct > hlist_head). Can we allocate this on demand for net_devices where > it is actually needed? The majority of virtual devices won't need > this. Doesn't have to be rhashtable, can still be fixed size but > at least allocate it.
Jiri probably misread the API and should have used : DECLARE_HASHTABLE (qdisc_hash, 4); Google has a very similar patch with 16 buckets, and it is 'good enough', although we do not hit the qdisc_tree_reduce_backlog() penalty.