Commit d47a0ac7 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

sch_sfq: dont put new flow at the end of flows

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: default avatarDave Taht <dave.taht@gmail.com>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1c015b3b
...@@ -366,11 +366,11 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) ...@@ -366,11 +366,11 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
if (slot->qlen == 1) { /* The flow is new */ if (slot->qlen == 1) { /* The flow is new */
if (q->tail == NULL) { /* It is the first flow */ if (q->tail == NULL) { /* It is the first flow */
slot->next = x; slot->next = x;
q->tail = slot;
} else { } else {
slot->next = q->tail->next; slot->next = q->tail->next;
q->tail->next = x; q->tail->next = x;
} }
q->tail = slot;
slot->allot = q->scaled_quantum; slot->allot = q->scaled_quantum;
} }
if (++sch->q.qlen <= q->limit) if (++sch->q.qlen <= q->limit)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment