summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sched/sch_netem.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
index c8bb62a1e744..94b4928ad413 100644
--- a/net/sched/sch_netem.c
+++ b/net/sched/sch_netem.c
@@ -462,7 +462,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
462 /* If a delay is expected, orphan the skb. (orphaning usually takes 462 /* If a delay is expected, orphan the skb. (orphaning usually takes
463 * place at TX completion time, so _before_ the link transit delay) 463 * place at TX completion time, so _before_ the link transit delay)
464 */ 464 */
465 if (q->latency || q->jitter) 465 if (q->latency || q->jitter || q->rate)
466 skb_orphan_partial(skb); 466 skb_orphan_partial(skb);
467 467
468 /* 468 /*
@@ -530,21 +530,31 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
530 now = psched_get_time(); 530 now = psched_get_time();
531 531
532 if (q->rate) { 532 if (q->rate) {
533 struct sk_buff *last; 533 struct netem_skb_cb *last = NULL;
534
535 if (sch->q.tail)
536 last = netem_skb_cb(sch->q.tail);
537 if (q->t_root.rb_node) {
538 struct sk_buff *t_skb;
539 struct netem_skb_cb *t_last;
540
541 t_skb = netem_rb_to_skb(rb_last(&q->t_root));
542 t_last = netem_skb_cb(t_skb);
543 if (!last ||
544 t_last->time_to_send > last->time_to_send) {
545 last = t_last;
546 }
547 }
534 548
535 if (sch->q.qlen)
536 last = sch->q.tail;
537 else
538 last = netem_rb_to_skb(rb_last(&q->t_root));
539 if (last) { 549 if (last) {
540 /* 550 /*
541 * Last packet in queue is reference point (now), 551 * Last packet in queue is reference point (now),
542 * calculate this time bonus and subtract 552 * calculate this time bonus and subtract
543 * from delay. 553 * from delay.
544 */ 554 */
545 delay -= netem_skb_cb(last)->time_to_send - now; 555 delay -= last->time_to_send - now;
546 delay = max_t(psched_tdiff_t, 0, delay); 556 delay = max_t(psched_tdiff_t, 0, delay);
547 now = netem_skb_cb(last)->time_to_send; 557 now = last->time_to_send;
548 } 558 }
549 559
550 delay += packet_len_2_sched_time(qdisc_pkt_len(skb), q); 560 delay += packet_len_2_sched_time(qdisc_pkt_len(skb), q);