• Jiri Kosina's avatar
    net: sched: avoid duplicates in qdisc dump · ea327469
    Jiri Kosina authored
    tc_dump_qdisc() performs dumping of the per-device qdiscs in two phases;
    first, the "standard" dev->qdisc is being dumped. Second, if there is/are
    ingress queue(s), they are being dumped as well.
    
    After conversion of netdevice's qdisc linked-list into hashtable, these
    two sets are not in two disjunctive sets/lists any more, but are both
    "reachable" directly from netdevice's hashtable. As a consequence, the
    "full-depth" dump of the ingress qdiscs results in immediately hitting the
    netdevice hashtable again, and duplicating the dump that has already been
    performed for dev->qdisc.
    What in fact needs to be dumped in case of ingress queue is "just" the
    top-level ingress qdisc, as everything else has been dumped already.
    
    Fix this by extending tc_dump_qdisc_root() in a way that it can be instructed
    whether it should (while performing the "full" per-netdev qdisc dump) perform
    the whole recursion, or just dump "additional" top-level (ingress) qdiscs
    without performing any kind of recursion.
    
    This fixes duplicate dumps such as
    
    	qdisc mq 0: root
    	qdisc pfifo_fast 0: parent :4 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :3 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :1 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc clsact ffff: parent ffff:fff1
    	qdisc pfifo_fast 0: parent :4 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :3 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    	qdisc pfifo_fast 0: parent :1 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    
    Fixes: 59cc1f61 ("net: sched: convert qdisc linked list to hashtable")
    Reported-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Tested-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ea327469
sch_api.c 45.8 KB