net: sched: convert qdisc linked list to hashtable
Convert the per-device linked list into a hashtable. The primary motivation for this change is that currently, we're not tracking all the qdiscs in hierarchy (e.g. excluding default qdiscs), as the lookup performed over the linked list by qdisc_match_from_root() is rather expensive. The ultimate goal is to get rid of hidden qdiscs completely, which will bring much more determinism in user experience. Reviewed-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
e87a8f24c9
commit
59cc1f61f0
@@ -423,7 +423,6 @@ struct Qdisc noop_qdisc = {
|
||||
.dequeue = noop_dequeue,
|
||||
.flags = TCQ_F_BUILTIN,
|
||||
.ops = &noop_qdisc_ops,
|
||||
.list = LIST_HEAD_INIT(noop_qdisc.list),
|
||||
.q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock),
|
||||
.dev_queue = &noop_netdev_queue,
|
||||
.running = SEQCNT_ZERO(noop_qdisc.running),
|
||||
@@ -613,7 +612,6 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
|
||||
sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p);
|
||||
sch->padded = (char *) sch - (char *) p;
|
||||
}
|
||||
INIT_LIST_HEAD(&sch->list);
|
||||
skb_queue_head_init(&sch->q);
|
||||
|
||||
spin_lock_init(&sch->busylock);
|
||||
@@ -700,7 +698,7 @@ void qdisc_destroy(struct Qdisc *qdisc)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_NET_SCHED
|
||||
qdisc_list_del(qdisc);
|
||||
qdisc_hash_del(qdisc);
|
||||
|
||||
qdisc_put_stab(rtnl_dereference(qdisc->stab));
|
||||
#endif
|
||||
@@ -788,6 +786,10 @@ static void attach_default_qdiscs(struct net_device *dev)
|
||||
qdisc->ops->attach(qdisc);
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_NET_SCHED
|
||||
if (dev->qdisc)
|
||||
qdisc_hash_add(dev->qdisc);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void transition_one_qdisc(struct net_device *dev,
|
||||
|
Reference in New Issue
Block a user