net_sched: sch_fq: handle non connected flows
authorEric Dumazet <edumazet@google.com>
Sat, 4 May 2019 23:48:54 +0000 (16:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 May 2019 19:09:25 +0000 (12:09 -0700)
commit37c0aead7902b1ddf1b668e1ab74c80b9a7fd183
tree0fe6429a54468c277bae91eaa708ad31c70d2be1
parenteeb84aa0d0aff3177c93397cdc62be87e54af486
net_sched: sch_fq: handle non connected flows

FQ packet scheduler assumed that packets could be classified
based on their owning socket.

This means that if a UDP server uses one UDP socket to send
packets to different destinations, packets all land
in one FQ flow.

This is unfair, since each TCP flow has a unique bucket, meaning
that in case of pressure (fully utilised uplink), TCP flows
have more share of the bandwidth.

If we instead detect unconnected sockets, we can use a stochastic
hash based on the 4-tuple hash.

This also means a QUIC server using one UDP socket will properly
spread the outgoing packets to different buckets, and in-kernel
pacing based on EDT model will no longer risk having big rb-tree on
one flow.

Note that UDP application might provide the skb->hash in an
ancillary message at sendmsg() time to avoid the cost of a dissection
in fq packet scheduler.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_fq.c