sch_sfq: dont put new flow at the end of flows
authorEric Dumazet <eric.dumazet@gmail.com>
Sun, 1 Jan 2012 18:33:31 +0000 (18:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Jan 2012 17:52:09 +0000 (12:52 -0500)
SFQ enqueue algo puts a new flow _behind_ all pre-existing flows in the
circular list. In fact this is probably an old SFQ implementation bug.

100 Mbits = ~8333 full frames per second, or ~8 frames per ms.

With 50 flows, it means your "new flow" will have to wait 50 packets
being sent before its own packet. Thats the ~6ms.

We certainly can change SFQ to give a priority advantage to new flows,
so that next dequeued packet is taken from a new flow, not an old one.

Reported-by: Dave Taht <dave.taht@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_sfq.c

index d329a8a72357619fbe2b8a883377f4bbb3c2a738..e9d5c911576d7095fad834b8228f3a5d240c56a7 100644 (file)
@@ -366,11 +366,11 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
        if (slot->qlen == 1) {          /* The flow is new */
                if (q->tail == NULL) {  /* It is the first flow */
                        slot->next = x;
+                       q->tail = slot;
                } else {
                        slot->next = q->tail->next;
                        q->tail->next = x;
                }
-               q->tail = slot;
                slot->allot = q->scaled_quantum;
        }
        if (++sch->q.qlen <= q->limit)