diff options
| author | Eric Dumazet <edumazet@google.com> | 2012-05-16 04:39:09 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-05-16 15:30:26 -0400 | 
| commit | 865ec5523dadbedefbc5710a68969f686a28d928 (patch) | |
| tree | b9f056cdea6922d5fc3ed035764660bb6fb152b3 /include/net | |
| parent | c27b46e7f1cbf3be95a4cf5840c76a7b7d54b26f (diff) | |
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 <edumazet@google.com>
Cc: Dave Taht <dave.taht@bufferbloat.net>
Cc: Kathleen Nichols <nichols@pollere.com>
Cc: Van Jacobson <van@pollere.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/codel.h | 15 | 
1 files changed, 7 insertions, 8 deletions
| diff --git a/include/net/codel.h b/include/net/codel.h index 7546517326b5..550debfc2403 100644 --- a/include/net/codel.h +++ b/include/net/codel.h @@ -205,7 +205,7 @@ static codel_time_t codel_control_law(codel_time_t t,  static bool codel_should_drop(const struct sk_buff *skb, -			      unsigned int *backlog, +			      struct Qdisc *sch,  			      struct codel_vars *vars,  			      struct codel_params *params,  			      struct codel_stats *stats, @@ -219,13 +219,13 @@ static bool codel_should_drop(const struct sk_buff *skb,  	}  	vars->ldelay = now - codel_get_enqueue_time(skb); -	*backlog -= qdisc_pkt_len(skb); +	sch->qstats.backlog -= qdisc_pkt_len(skb);  	if (unlikely(qdisc_pkt_len(skb) > stats->maxpacket))  		stats->maxpacket = qdisc_pkt_len(skb);  	if (codel_time_before(vars->ldelay, params->target) || -	    *backlog <= stats->maxpacket) { +	    sch->qstats.backlog <= stats->maxpacket) {  		/* went below - stay below for at least interval */  		vars->first_above_time = 0;  		return false; @@ -249,8 +249,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,  				     struct codel_params *params,  				     struct codel_vars *vars,  				     struct codel_stats *stats, -				     codel_skb_dequeue_t dequeue_func, -				     u32 *backlog) +				     codel_skb_dequeue_t dequeue_func)  {  	struct sk_buff *skb = dequeue_func(vars, sch);  	codel_time_t now; @@ -261,7 +260,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,  		return skb;  	}  	now = codel_get_time(); -	drop = codel_should_drop(skb, backlog, vars, params, stats, now); +	drop = codel_should_drop(skb, sch, vars, params, stats, now);  	if (vars->dropping) {  		if (!drop) {  			/* sojourn time below target - leave dropping state */ @@ -292,7 +291,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,  				qdisc_drop(skb, sch);  				stats->drop_count++;  				skb = dequeue_func(vars, sch); -				if (!codel_should_drop(skb, backlog, +				if (!codel_should_drop(skb, sch,  						       vars, params, stats, now)) {  					/* leave dropping state */  					vars->dropping = false; @@ -313,7 +312,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,  			stats->drop_count++;  			skb = dequeue_func(vars, sch); -			drop = codel_should_drop(skb, backlog, vars, params, +			drop = codel_should_drop(skb, sch, vars, params,  						 stats, now);  		}  		vars->dropping = true; | 
