1
0
Fork 0
remarkable-linux/net/sched
Patrick McHardy 43effa1e57 [NET_SCHED]: Fix endless loops caused by inaccurate qlen counters (part 1)
There are multiple problems related to qlen adjustment that can lead
to an upper qdisc getting out of sync with the real number of packets
queued, leading to endless dequeueing attempts by the upper layer code.

All qdiscs must maintain an accurate q.qlen counter. There are basically
two groups of operations affecting the qlen: operations that propagate
down the tree (enqueue, dequeue, requeue, drop, reset) beginning at the
root qdisc and operations only affecting a subtree or single qdisc
(change, graft, delete class). Since qlen changes during operations from
the second group don't propagate to ancestor qdiscs, their qlen values
become desynchronized.

This patch adds a function to propagate qlen changes up the qdisc tree,
optionally calling a callback function to perform qdisc-internal
maintenance when the child qdisc becomes empty. The follow-up patches
will convert all qdiscs to use this function where necessary.

Noticed by Timo Steinbach <tsteinbach@astaro.com>.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2006-12-02 21:31:42 -08:00
..
Kconfig [PKT_SCHED]: Make sch_fifo.o available when CONFIG_NET_SCHED is not set. 2006-12-02 21:21:43 -08:00
Makefile [PKT_SCHED]: Make sch_fifo.o available when CONFIG_NET_SCHED is not set. 2006-12-02 21:21:43 -08:00
act_api.c [PKT_SCHED]: Kill pkt_act.h inlining. 2006-09-22 14:55:10 -07:00
act_gact.c [PKT_SCHED]: Kill pkt_act.h inlining. 2006-09-22 14:55:10 -07:00
act_ipt.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
act_mirred.c [PKT_SCHED]: Kill pkt_act.h inlining. 2006-09-22 14:55:10 -07:00
act_pedit.c [PKT_SCHED]: Kill pkt_act.h inlining. 2006-09-22 14:55:10 -07:00
act_police.c [PKT_SCHED]: Kill pkt_act.h inlining. 2006-09-22 14:55:10 -07:00
act_simple.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
cls_api.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
cls_basic.c [PKT_SCHED] cls_basic: Use unsigned int when generating handle 2006-09-28 18:01:45 -07:00
cls_fw.c [NET]: Turn nfmark into generic mark 2006-12-02 21:21:38 -08:00
cls_route.c [NET]: Conversions from kmalloc+memset to k(z|c)alloc. 2006-07-21 14:51:30 -07:00
cls_rsvp.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
cls_rsvp.h [NET]: net/sched annotations. 2006-12-02 21:27:19 -08:00
cls_rsvp6.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
cls_tcindex.c [NET]: Conversions from kmalloc+memset to k(z|c)alloc. 2006-07-21 14:51:30 -07:00
cls_u32.c [NET]: Turn nfmark into generic mark 2006-12-02 21:21:38 -08:00
em_cmp.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
em_meta.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
em_nbyte.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
em_text.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
em_u32.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
ematch.c [SCHED]: Use kmemdup & kzalloc where appropriate 2006-12-02 21:30:18 -08:00
sch_api.c [NET_SCHED]: Fix endless loops caused by inaccurate qlen counters (part 1) 2006-12-02 21:31:42 -08:00
sch_atm.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_blackhole.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
sch_cbq.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_dsmark.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_fifo.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
sch_generic.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_gred.c [NET]: Conversions from kmalloc+memset to k(z|c)alloc. 2006-07-21 14:51:30 -07:00
sch_hfsc.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_htb.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_ingress.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
sch_netem.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_prio.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_red.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_sfq.c Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
sch_tbf.c [NET_SCHED]: Set parent classid in default qdiscs 2006-12-02 21:31:41 -08:00
sch_teql.c [NET]: Add netif_tx_lock 2006-06-17 21:30:14 -07:00