11 Mar, 2014

1 commit

  • Resizing fq hash table allocates memory while holding qdisc spinlock,
    with BH disabled.

    This is definitely not good, as allocation might sleep.

    We can drop the lock and get it when needed, we hold RTNL so no other
    changes can happen at the same time.

    Signed-off-by: Eric Dumazet
    Fixes: afe4fd062416 ("pkt_sched: fq: Fair Queue packet scheduler")
    Signed-off-by: David S. Miller

    Eric Dumazet
     

18 Dec, 2013

2 commits


16 Nov, 2013

2 commits

  • For performance reasons, sch_fq tried hard to not setup timers for every
    sent packet, using a quantum based heuristic : A delay is setup only if
    the flow exhausted its credit.

    Problem is that application limited flows can refill their credit
    for every queued packet, and they can evade pacing.

    This problem can also be triggered when TCP flows use small MSS values,
    as TSO auto sizing builds packets that are smaller than the default fq
    quantum (3028 bytes)

    This patch adds a 40 ms delay to guard flow credit refill.

    Fixes: afe4fd062416 ("pkt_sched: fq: Fair Queue packet scheduler")
    Signed-off-by: Eric Dumazet
    Cc: Maciej Żenczykowski
    Cc: Willem de Bruijn
    Cc: Yuchung Cheng
    Cc: Neal Cardwell
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • Commit 7eec4174ff29 ("pkt_sched: fq: fix non TCP flows pacing")
    obsoleted TCA_FQ_FLOW_DEFAULT_RATE without notice for the users.

    Suggested by David Miller

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

15 Nov, 2013

1 commit

  • Initial sch_fq implementation copied code from pfifo_fast to classify
    a packet as a high prio packet.

    This clashes with setups using PRIO with say 7 bands, as one of the
    band could be incorrectly (mis)classified by FQ.

    Packets would be queued in the 'internal' queue, and no pacing ever
    happen for this special queue.

    Fixes: afe4fd062416 ("pkt_sched: fq: Fair Queue packet scheduler")
    Signed-off-by: Maciej Żenczykowski
    Signed-off-by: Eric Dumazet
    Cc: Stephen Hemminger
    Cc: Willem de Bruijn
    Cc: Yuchung Cheng
    Signed-off-by: David S. Miller

    Maciej Żenczykowski
     

28 Oct, 2013

1 commit


09 Oct, 2013

2 commits

  • Steinar reported FQ pacing was not working for UDP flows.

    It looks like the initial sk->sk_pacing_rate value of 0 was
    a wrong choice. We should init it to ~0U (unlimited)

    Then, TCA_FQ_FLOW_DEFAULT_RATE should be removed because it makes
    no real sense. The default rate is really unlimited, and we
    need to avoid a zero divide.

    Reported-by: Steinar H. Gunderson
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • TCA_FQ_INITIAL_QUANTUM should set q->initial_quantum

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

02 Oct, 2013

1 commit

  • FQ rate limiting suffers from two problems, reported
    by Steinar :

    1) FQ enforces a delay when flow quantum is exhausted in order
    to reduce cpu overhead. But if packets are small, current
    delay computation is slightly wrong, and observed rates can
    be too high.

    Steinar had this problem because he disabled TSO and GSO,
    and default FQ quantum is 2*1514.

    (Of course, I wish recent TSO auto sizing changes will help
    to not having to disable TSO in the first place)

    2) maxrate was not used for forwarded flows (skbs not attached
    to a socket)

    Tested:

    tc qdisc add dev eth0 root est 1sec 4sec fq maxrate 8Mbit
    netperf -H lpq84 -l 1000 &
    sleep 10 ; tc -s qdisc show dev eth0
    qdisc fq 8003: root refcnt 32 limit 10000p flow_limit 100p buckets 1024
    quantum 3028 initial_quantum 15140 maxrate 8000Kbit
    Sent 16819357 bytes 11258 pkt (dropped 0, overlimits 0 requeues 0)
    rate 7831Kbit 653pps backlog 7570b 5p requeues 0
    44 flows (43 inactive, 1 throttled), next packet delay 2977352 ns
    0 gc, 0 highprio, 5545 throttled

    lpq83:~# tcpdump -p -i eth0 host lpq84 -c 12
    09:02:52.079484 IP lpq83 > lpq84: . 1389536928:1389538376(1448) ack 3808678021 win 457
    09:02:52.079499 IP lpq83 > lpq84: . 1448:2896(1448) ack 1 win 457
    09:02:52.079906 IP lpq84 > lpq83: . ack 2896 win 16384
    09:02:52.082568 IP lpq83 > lpq84: . 2896:4344(1448) ack 1 win 457
    09:02:52.082581 IP lpq83 > lpq84: . 4344:5792(1448) ack 1 win 457
    09:02:52.083017 IP lpq84 > lpq83: . ack 5792 win 16384
    09:02:52.085678 IP lpq83 > lpq84: . 5792:7240(1448) ack 1 win 457
    09:02:52.085693 IP lpq83 > lpq84: . 7240:8688(1448) ack 1 win 457
    09:02:52.086117 IP lpq84 > lpq83: . ack 8688 win 16384
    09:02:52.088792 IP lpq83 > lpq84: . 8688:10136(1448) ack 1 win 457
    09:02:52.088806 IP lpq83 > lpq84: . 10136:11584(1448) ack 1 win 457
    09:02:52.089217 IP lpq84 > lpq83: . ack 11584 win 16384

    Reported-by: Steinar H. Gunderson
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

01 Oct, 2013

1 commit

  • fq_reset() should drops all packets in queue, including
    throttled flows.

    This patch moves code from fq_destroy() to fq_reset()
    to do the cleaning.

    fq_change() must stop calling fq_dequeue() if all remaining
    packets are from throttled flows.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

31 Aug, 2013

1 commit

  • kbuild bot reported following m68k build error :

    net/sched/sch_fq.c: In function 'fq_dequeue':
    >> net/sched/sch_fq.c:491:2: error: implicit declaration of function
    'prefetch' [-Werror=implicit-function-declaration]
    cc1: some warnings being treated as errors

    While we are fixing this, move this prefetch() call a bit earlier.

    Reported-by: Wu Fengguang
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

30 Aug, 2013

1 commit

  • - Uses perfect flow match (not stochastic hash like SFQ/FQ_codel)
    - Uses the new_flow/old_flow separation from FQ_codel
    - New flows get an initial credit allowing IW10 without added delay.
    - Special FIFO queue for high prio packets (no need for PRIO + FQ)
    - Uses a hash table of RB trees to locate the flows at enqueue() time
    - Smart on demand gc (at enqueue() time, RB tree lookup evicts old
    unused flows)
    - Dynamic memory allocations.
    - Designed to allow millions of concurrent flows per Qdisc.
    - Small memory footprint : ~8K per Qdisc, and 104 bytes per flow.
    - Single high resolution timer for throttled flows (if any).
    - One RB tree to link throttled flows.
    - Ability to have a max rate per flow. We might add a socket option
    to add per socket limitation.

    Attempts have been made to add TCP pacing in TCP stack, but this
    seems to add complex code to an already complex stack.

    TCP pacing is welcomed for flows having idle times, as the cwnd
    permits TCP stack to queue a possibly large number of packets.

    This removes the 'slow start after idle' choice, hitting badly
    large BDP flows, and applications delivering chunks of data
    as video streams.

    Nicely spaced packets :
    Here interface is 10Gbit, but flow bottleneck is ~20Mbit

    cwin is big, yet FQ avoids the typical bursts generated by TCP
    (as in netperf TCP_RR -- -r 100000,100000)

    15:01:23.545279 IP A > B: . 78193:81089(2896) ack 65248 win 3125
    15:01:23.545394 IP B > A: . ack 81089 win 3668
    15:01:23.546488 IP A > B: . 81089:83985(2896) ack 65248 win 3125
    15:01:23.546565 IP B > A: . ack 83985 win 3668
    15:01:23.547713 IP A > B: . 83985:86881(2896) ack 65248 win 3125
    15:01:23.547778 IP B > A: . ack 86881 win 3668
    15:01:23.548911 IP A > B: . 86881:89777(2896) ack 65248 win 3125
    15:01:23.548949 IP B > A: . ack 89777 win 3668
    15:01:23.550116 IP A > B: . 89777:92673(2896) ack 65248 win 3125
    15:01:23.550182 IP B > A: . ack 92673 win 3668
    15:01:23.551333 IP A > B: . 92673:95569(2896) ack 65248 win 3125
    15:01:23.551406 IP B > A: . ack 95569 win 3668
    15:01:23.552539 IP A > B: . 95569:98465(2896) ack 65248 win 3125
    15:01:23.552576 IP B > A: . ack 98465 win 3668
    15:01:23.553756 IP A > B: . 98465:99913(1448) ack 65248 win 3125
    15:01:23.554138 IP A > B: P 99913:100001(88) ack 65248 win 3125
    15:01:23.554204 IP B > A: . ack 100001 win 3668
    15:01:23.554234 IP B > A: . 65248:68144(2896) ack 100001 win 3668
    15:01:23.555620 IP B > A: . 68144:71040(2896) ack 100001 win 3668
    15:01:23.557005 IP B > A: . 71040:73936(2896) ack 100001 win 3668
    15:01:23.558390 IP B > A: . 73936:76832(2896) ack 100001 win 3668
    15:01:23.559773 IP B > A: . 76832:79728(2896) ack 100001 win 3668
    15:01:23.561158 IP B > A: . 79728:82624(2896) ack 100001 win 3668
    15:01:23.562543 IP B > A: . 82624:85520(2896) ack 100001 win 3668
    15:01:23.563928 IP B > A: . 85520:88416(2896) ack 100001 win 3668
    15:01:23.565313 IP B > A: . 88416:91312(2896) ack 100001 win 3668
    15:01:23.566698 IP B > A: . 91312:94208(2896) ack 100001 win 3668
    15:01:23.568083 IP B > A: . 94208:97104(2896) ack 100001 win 3668
    15:01:23.569467 IP B > A: . 97104:100000(2896) ack 100001 win 3668
    15:01:23.570852 IP B > A: . 100000:102896(2896) ack 100001 win 3668
    15:01:23.572237 IP B > A: . 102896:105792(2896) ack 100001 win 3668
    15:01:23.573639 IP B > A: . 105792:108688(2896) ack 100001 win 3668
    15:01:23.575024 IP B > A: . 108688:111584(2896) ack 100001 win 3668
    15:01:23.576408 IP B > A: . 111584:114480(2896) ack 100001 win 3668
    15:01:23.577793 IP B > A: . 114480:117376(2896) ack 100001 win 3668

    TCP timestamps show that most packets from B were queued in the same ms
    timeframe (TSval 1159799{3,4}), but FQ managed to send them right
    in time to avoid a big burst.

    In slow start or steady state, very few packets are throttled [1]

    FQ gets a bunch of tunables as :

    limit : max number of packets on whole Qdisc (default 10000)

    flow_limit : max number of packets per flow (default 100)

    quantum : the credit per RR round (default is 2 MTU)

    initial_quantum : initial credit for new flows (default is 10 MTU)

    maxrate : max per flow rate (default : unlimited)

    buckets : number of RB trees (default : 1024) in hash table.
    (consumes 8 bytes per bucket)

    [no]pacing : disable/enable pacing (default is enable)

    All of them can be changed on a live qdisc.

    $ tc qd add dev eth0 root fq help
    Usage: ... fq [ limit PACKETS ] [ flow_limit PACKETS ]
    [ quantum BYTES ] [ initial_quantum BYTES ]
    [ maxrate RATE ] [ buckets NUMBER ]
    [ [no]pacing ]

    $ tc -s -d qd
    qdisc fq 8002: dev eth0 root refcnt 32 limit 10000p flow_limit 100p buckets 256 quantum 3028 initial_quantum 15140
    Sent 216532416 bytes 148395 pkt (dropped 0, overlimits 0 requeues 14)
    backlog 0b 0p requeues 14
    511 flows, 511 inactive, 0 throttled
    110 gc, 0 highprio, 0 retrans, 1143 throttled, 0 flows_plimit

    [1] Except if initial srtt is overestimated, as if using
    cached srtt in tcp metrics. We'll provide a fix for this issue.

    Signed-off-by: Eric Dumazet
    Cc: Yuchung Cheng
    Cc: Neal Cardwell
    Signed-off-by: David S. Miller

    Eric Dumazet