diff options
Diffstat (limited to 'net/sched/sch_fq.c')
-rw-r--r-- | net/sched/sch_fq.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index 4b1af706896c..25a7cf6d380f 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c | |||
@@ -469,22 +469,29 @@ begin: | |||
469 | goto begin; | 469 | goto begin; |
470 | } | 470 | } |
471 | prefetch(&skb->end); | 471 | prefetch(&skb->end); |
472 | f->credit -= qdisc_pkt_len(skb); | 472 | plen = qdisc_pkt_len(skb); |
473 | f->credit -= plen; | ||
473 | 474 | ||
474 | if (ktime_to_ns(skb->tstamp) || !q->rate_enable) | 475 | if (!q->rate_enable) |
475 | goto out; | 476 | goto out; |
476 | 477 | ||
477 | rate = q->flow_max_rate; | 478 | rate = q->flow_max_rate; |
478 | if (skb->sk) | 479 | |
479 | rate = min(skb->sk->sk_pacing_rate, rate); | 480 | /* If EDT time was provided for this skb, we need to |
480 | 481 | * update f->time_next_packet only if this qdisc enforces | |
481 | if (rate <= q->low_rate_threshold) { | 482 | * a flow max rate. |
482 | f->credit = 0; | 483 | */ |
483 | plen = qdisc_pkt_len(skb); | 484 | if (!skb->tstamp) { |
484 | } else { | 485 | if (skb->sk) |
485 | plen = max(qdisc_pkt_len(skb), q->quantum); | 486 | rate = min(skb->sk->sk_pacing_rate, rate); |
486 | if (f->credit > 0) | 487 | |
487 | goto out; | 488 | if (rate <= q->low_rate_threshold) { |
489 | f->credit = 0; | ||
490 | } else { | ||
491 | plen = max(plen, q->quantum); | ||
492 | if (f->credit > 0) | ||
493 | goto out; | ||
494 | } | ||
488 | } | 495 | } |
489 | if (rate != ~0UL) { | 496 | if (rate != ~0UL) { |
490 | u64 len = (u64)plen * NSEC_PER_SEC; | 497 | u64 len = (u64)plen * NSEC_PER_SEC; |