From 865ec5523dadbedefbc5710a68969f686a28d928 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 16 May 2012 04:39:09 +0000 Subject: fq_codel: should use qdisc backlog as threshold codel_should_drop() logic allows a packet being not dropped if queue size is under max packet size. In fq_codel, we have two possible backlogs : The qdisc global one, and the flow local one. The meaningful one for codel_should_drop() should be the global backlog, not the per flow one, so that thin flows can have a non zero drop/mark probability. Signed-off-by: Eric Dumazet Cc: Dave Taht Cc: Kathleen Nichols Cc: Van Jacobson Signed-off-by: David S. Miller --- net/sched/sch_codel.c | 4 ++-- net/sched/sch_fq_codel.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'net/sched') diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c index 213ef60bced..2f9ab17db85 100644 --- a/net/sched/sch_codel.c +++ b/net/sched/sch_codel.c @@ -77,8 +77,8 @@ static struct sk_buff *codel_qdisc_dequeue(struct Qdisc *sch) struct codel_sched_data *q = qdisc_priv(sch); struct sk_buff *skb; - skb = codel_dequeue(sch, &q->params, &q->vars, &q->stats, - dequeue, &sch->qstats.backlog); + skb = codel_dequeue(sch, &q->params, &q->vars, &q->stats, dequeue); + /* We cant call qdisc_tree_decrease_qlen() if our qlen is 0, * or HTB crashes. Defer it for next round. */ diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index 337ff204f27..9fc1c62ec80 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c @@ -217,13 +217,14 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) */ static struct sk_buff *dequeue(struct codel_vars *vars, struct Qdisc *sch) { + struct fq_codel_sched_data *q = qdisc_priv(sch); struct fq_codel_flow *flow; struct sk_buff *skb = NULL; flow = container_of(vars, struct fq_codel_flow, cvars); if (flow->head) { skb = dequeue_head(flow); - sch->qstats.backlog -= qdisc_pkt_len(skb); + q->backlogs[flow - q->flows] -= qdisc_pkt_len(skb); sch->q.qlen--; } return skb; @@ -256,7 +257,7 @@ begin: prev_ecn_mark = q->cstats.ecn_mark; skb = codel_dequeue(sch, &q->cparams, &flow->cvars, &q->cstats, - dequeue, &q->backlogs[flow - q->flows]); + dequeue); flow->dropped += q->cstats.drop_count - prev_drop_count; flow->dropped += q->cstats.ecn_mark - prev_ecn_mark; -- cgit v1.2.3-18-g5258