mptcp: fastclose msk when cleaning unaccepted sockets
authorPaolo Abeni <pabeni@redhat.com>
Fri, 14 Apr 2023 14:08:04 +0000 (16:08 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Apr 2023 07:18:34 +0000 (08:18 +0100)
When cleaning up unaccepted mptcp socket still laying inside
the listener queue at listener close time, such sockets will
go through a regular close, waiting for a timeout before
shutting down the subflows.

There is no need to keep the kernel resources in use for
such a possibly long time: short-circuit to fast-close.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c

index a676ac1..1926b81 100644 (file)
@@ -2953,10 +2953,13 @@ bool __mptcp_close(struct sock *sk, long timeout)
                goto cleanup;
        }
 
-       if (mptcp_check_readable(msk)) {
-               /* the msk has read data, do the MPTCP equivalent of TCP reset */
+       if (mptcp_check_readable(msk) || timeout < 0) {
+               /* If the msk has read data, or the caller explicitly ask it,
+                * do the MPTCP equivalent of TCP reset, aka MPTCP fastclose
+                */
                inet_sk_state_store(sk, TCP_CLOSE);
                mptcp_do_fastclose(sk);
+               timeout = 0;
        } else if (mptcp_close_state(sk)) {
                __mptcp_wr_shutdown(sk);
        }