kernel: fq_codel match flows_cnt to limit sizing
authorKevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
Sat, 7 May 2016 08:57:18 +0000 (09:57 +0100)
committerJohn Crispin <john@phrozen.org>
Thu, 12 May 2016 01:29:36 +0000 (03:29 +0200)
OpenWRT changed the default fq_codel sch->limit from 10240 to 1024,
without also adjusting q->flows_cnt.  Eric Dumazet explains below that
you must also adjust the buckets (q->flows_cnt) for this not to break.

Eric explains: Limit of 1024 packets and 1024 flows is not wise I think.
(If all buckets are in use, each bucket has a virtual queue of 1 packet,
which is almost the same than having no queue at all)

I suggest to have at least 8 packets per bucket, to let Codel have a
chance to trigger.  So you could either reduce number of buckets to 128
(if memory is tight), or increase limit to 8192.

flows_cnt is now set to 1024/8=128

Signed-off-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
target/linux/generic/patches-3.18/660-fq_codel_defaults.patch
target/linux/generic/patches-4.1/660-fq_codel_defaults.patch
target/linux/generic/patches-4.4/660-fq_codel_defaults.patch

index 8c99e62cececa7902ca9793368368be200cfee66..e0f73dedb95b1a41338278ab17dea0c9212e9b57 100644 (file)
@@ -1,11 +1,13 @@
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
-@@ -387,7 +387,7 @@ static int fq_codel_init(struct Qdisc *s
+@@ -387,8 +387,8 @@ static int fq_codel_init(struct Qdisc *s
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
+-      q->flows_cnt = 1024;
 +      sch->limit = 1024;
 +      sch->limit = 1024;
-       q->flows_cnt = 1024;
++      q->flows_cnt = 128;
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
+       INIT_LIST_HEAD(&q->new_flows);
index 8c99e62cececa7902ca9793368368be200cfee66..e0f73dedb95b1a41338278ab17dea0c9212e9b57 100644 (file)
@@ -1,11 +1,13 @@
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
-@@ -387,7 +387,7 @@ static int fq_codel_init(struct Qdisc *s
+@@ -387,8 +387,8 @@ static int fq_codel_init(struct Qdisc *s
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
+-      q->flows_cnt = 1024;
 +      sch->limit = 1024;
 +      sch->limit = 1024;
-       q->flows_cnt = 1024;
++      q->flows_cnt = 128;
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
+       INIT_LIST_HEAD(&q->new_flows);
index cf4ff6fb186f660d8f728ff7713220249e2530b3..5d99cd7fb4fd1fc9be25927f8ea251d1e367db71 100644 (file)
@@ -1,11 +1,13 @@
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
 --- a/net/sched/sch_fq_codel.c
 +++ b/net/sched/sch_fq_codel.c
-@@ -412,7 +412,7 @@ static int fq_codel_init(struct Qdisc *s
+@@ -412,8 +412,8 @@ static int fq_codel_init(struct Qdisc *s
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
        struct fq_codel_sched_data *q = qdisc_priv(sch);
        int i;
  
 -      sch->limit = 10*1024;
+-      q->flows_cnt = 1024;
 +      sch->limit = 1024;
 +      sch->limit = 1024;
-       q->flows_cnt = 1024;
++      q->flows_cnt = 128;
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
        q->quantum = psched_mtu(qdisc_dev(sch));
        q->perturbation = prandom_u32();
+       INIT_LIST_HEAD(&q->new_flows);