]> git.baikalelectronics.ru Git - kernel.git/commit
tcp: limit GSO packets to half cwnd
authorEric Dumazet <edumazet@google.com>
Thu, 13 Nov 2014 17:45:22 +0000 (09:45 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Nov 2014 20:21:44 +0000 (15:21 -0500)
commit58021c26f987d7a28df42fdb7ad1c1d31be4fc54
tree6df6122eab00941a543a7e38a3cc50b62a6f7600
parentdd452db6d5f7c60af9c870989733efaef679de18
tcp: limit GSO packets to half cwnd

In DC world, GSO packets initially cooked by tcp_sendmsg() are usually
big, as sk_pacing_rate is high.

When network is congested, cwnd can be smaller than the GSO packets
found in socket write queue. tcp_write_xmit() splits GSO packets
using the available cwnd, and we end up sending a single GSO packet,
consuming all available cwnd.

With GRO aggregation on the receiver, we might handle a single GRO
packet, sending back a single ACK.

1) This single ACK might be lost
   TLP or RTO are forced to attempt a retransmit.
2) This ACK releases a full cwnd, sender sends another big GSO packet,
   in a ping pong mode.

This behavior does not fill the pipes in the best way, because of
scheduling artifacts.

Make sure we always have at least two GSO packets in flight.

This allows us to safely increase GRO efficiency without risking
spurious retransmits.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_output.c