diff options
Diffstat (limited to 'net/sched/sch_netem.c')
| -rw-r--r-- | net/sched/sch_netem.c | 12 | 
1 files changed, 6 insertions, 6 deletions
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 298c0ddfb57..3d2acc7a9c8 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -438,18 +438,18 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)  		if (q->rate) {  			struct sk_buff_head *list = &sch->q; -			delay += packet_len_2_sched_time(skb->len, q); -  			if (!skb_queue_empty(list)) {  				/* -				 * Last packet in queue is reference point (now). -				 * First packet in queue is already in flight, -				 * calculate this time bonus and substract +				 * Last packet in queue is reference point (now), +				 * calculate this time bonus and subtract  				 * from delay.  				 */ -				delay -= now - netem_skb_cb(skb_peek(list))->time_to_send; +				delay -= netem_skb_cb(skb_peek_tail(list))->time_to_send - now; +				delay = max_t(psched_tdiff_t, 0, delay);  				now = netem_skb_cb(skb_peek_tail(list))->time_to_send;  			} + +			delay += packet_len_2_sched_time(skb->len, q);  		}  		cb->time_to_send = now + delay;  |