diff options
| -rw-r--r-- | net/sched/sch_netem.c | 26 |
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); |
