: Fix endless loops (part 5): netem/tbf/hfsc ->requeue failures
Subsystems (4)
I forgot to fix one (AFAICT purely theoretical) case ..
[NET_SCHED]: Fix endless loops (part 5): netem/tbf/hfsc ->requeue failures
When peeking at the next packet in a child qdisc by calling dequeue/requeue, the upper qdisc qlen counter may get out of sync in case the requeue fails. The qdisc and the child qdisc both have their counter decremented, but since no packet is given to the upper qdisc it won't decrement its counter itself.
requeue should not fail, so this is mostly for "correctness".
---
commit 929cc41d7993cf356bcf1693c924e016df55a6a9
tree 8d0017e51e6285b4d584864e564e4d4512463b99
parent cc6f4de81d666f76192bee629473ff6fbd66286c
author Patrick McHardy <[email protected]> Mon, 20 Nov 2006 15:59:14 +0100 committer Patrick McHardy <[email protected]> Mon, 20 Nov 2006 15:59:14 +0100
net/sched/sch_hfsc.c | 1 + net/sched/sch_netem.c | 5 +---- net/sched/sch_tbf.c | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-)
net/sched/sch_hfsc.c +1 -0
@@ -946,6 +946,7 @@ qdisc_peek_len(struct Qdisc *sch)if (unlikely (sch->ops->requeue (skb, sch) !=NET_XMIT_SUCCESS )) {if (net_ratelimit ())printk ("qdisc_peek_len: failed to requeue\n" ); +qdisc_tree_decrease_qlen (sch,1 );return 0 ; }return len;
net/sched/sch_netem.c +1 -4
@@ -287,13 +287,10 @@ static struct sk_buff *netem_dequeue(strpsched_tdiff_t delay =PSCHED_TDIFF (cb->time_to_send, now);if (q->qdisc->ops->requeue (skb, q->qdisc) !=NET_XMIT_SUCCESS ) { +qdisc_tree_decrease_qlen (q->qdisc,1 ); sch->qstats.drops++; - -/* After this qlen is confused */ printk (KERN_ERR "netem: queue discpline %s could not requeue\n" , q->qdisc->ops->id); - - sch->q.qlen--; }mod_timer (&q->timer, jiffies +PSCHED_US2JIFFIE (delay));
net/sched/sch_tbf.c +1 -1
@@ -250,7 +250,7 @@ static struct sk_buff *tbf_dequeue(strucif (q->qdisc->ops->requeue (skb, q->qdisc) !=NET_XMIT_SUCCESS ) {/* When requeue fails skb is dropped */ - sch->q.qlen--; +qdisc_tree_decrease_qlen (q->qdisc,1 ); sch->qstats.drops++; }
Quoted 2 lines · On Mon, 20 Nov 2006 16:01:03 +0100 Patrick McHardy <[email protected]> wrote:
I forgot to fix one (AFAICT purely theoretical) case ..
So this means that if requeue fails we are no longer bolluxed.
Signature · 1 line
Stephen Hemminger <[email protected]>
David Miller
maintainerFrom: Patrick McHardy <[email protected]>
Date: Mon, 20 Nov 2006 16:01:03 +0100
Quoted 1 line
I forgot to fix one (AFAICT purely theoretical) case ..
Also applied to net-2.6.20, thanks a lot Patrick.