]> git.baikalelectronics.ru Git - kernel.git/commit
tcp: avoid looping in tcp_send_fin()
authorEric Dumazet <edumazet@google.com>
Thu, 23 Apr 2015 17:42:39 +0000 (10:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Apr 2015 15:06:48 +0000 (11:06 -0400)
commitaaea5699ad99c525dc4fb6c1cc488432aaf733aa
tree3a14cdcb01442f0f4d61a3161a9ac508bbdb3732
parent8e64fe23f2a1eaab9fdca7c3e538414f0228a435
tcp: avoid looping in tcp_send_fin()

Presence of an unbound loop in tcp_send_fin() had always been hard
to explain when analyzing crash dumps involving gigantic dying processes
with millions of sockets.

Lets try a different strategy :

In case of memory pressure, try to add the FIN flag to last packet
in write queue, even if packet was already sent. TCP stack will
be able to deliver this FIN after a timeout event. Note that this
FIN being delivered by a retransmit, it also carries a Push flag
given our current implementation.

By checking sk_under_memory_pressure(), we anticipate that cooking
many FIN packets might deplete tcp memory.

In the case we could not allocate a packet, even with __GFP_WAIT
allocation, then not sending a FIN seems quite reasonable if it allows
to get rid of this socket, free memory, and not block the process from
eventually doing other useful work.

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