Whamcloud - gitweb
LU-18137 ksocklnd: Fix TCP socket cleanup 89/56089/4
authorMark Roper <ropermar@amazon.com>
Sun, 18 Aug 2024 18:25:54 +0000 (18:25 +0000)
committerOleg Drokin <green@whamcloud.com>
Fri, 30 Aug 2024 06:02:27 +0000 (06:02 +0000)
Linux upstream commit v6.11-rc3-g151c9c724d05d5b0d changed the
handling of orphaned TCP connections. The commit stops the timers
and orphan connection cleanup by default for kernel-created
sockets after sock_release is called. ksocklnd relies on Linux
TCP orphan connection cleanup and this commit changes ksocklnd
socket creation to increment sk_net_refcnt on each socket it
creates and to register each socket with the namespace for
proper orphan connection management.

The upstream Linux commit has been backported to various Linux
distributions including Amazon Linux 2 kernels 4.14 and 5.10.

Test-Parameters: trivial
Signed-off-by: Mark Roper <ropermar@amazon.com>
Change-Id: Ib70ba8fcc3f1e49d3afbe788fccd777d02ec39b8
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56089
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lnet/autoconf/lustre-lnet.m4
lnet/klnds/socklnd/socklnd.h
lnet/klnds/socklnd/socklnd_lib.c

index cb44649..cb4e936 100644 (file)
@@ -1027,6 +1027,28 @@ AC_DEFUN([LN_CONFIG_SOCK_CREATE_KERN], [
 ]) # LN_CONFIG_SOCK_CREATE_KERN
 
 #
+# LN_CONFIG_SOCK_NOT_OWNED_BY_ME
+#
+# Linux upstream v6.11-rc3-g151c9c724d05d5b0d changes TCP socket orphan
+# cleanup, requiring a change in ksocklnd if present. This has been back-ported
+# to 4.* and 5.* Linux distributions.
+#
+AC_DEFUN([LN_SRC_CONFIG_SOCK_NOT_OWNED_BY_ME], [
+       LB2_LINUX_TEST_SRC([sock_not_owned_by_me], [
+               #include <net/sock.h>
+       ],[
+               sock_not_owned_by_me((const struct sock *)0);
+       ],[-Werror])
+])
+AC_DEFUN([LN_CONFIG_SOCK_NOT_OWNED_BY_ME], [
+       LB2_MSG_LINUX_TEST_RESULT([if Linux kernel has 'sock_not_owned_by_me'],
+       [sock_not_owned_by_me], [
+               AC_DEFINE(HAVE_SOCK_NOT_OWNED_BY_ME, 1,
+                       [sock_not_owned_by_me is defined in sock.h])
+       ])
+]) # LN_CONFIG_SOCK_NOT_OWNED_BY_ME
+
+#
 # LN_CONFIG_SK_DATA_READY
 #
 # 3.15 for struct sock the *sk_data_ready() field only takes one argument now
@@ -1205,6 +1227,7 @@ AC_DEFUN([LN_PROG_LINUX_SRC], [
        LN_SRC_CONFIG_SK_DATA_READY
        # 4.x
        LN_SRC_CONFIG_SOCK_CREATE_KERN
+       LN_SRC_CONFIG_SOCK_NOT_OWNED_BY_ME
        # 4.6
        LN_SRC_ETHTOOL_LINK_SETTINGS
        # 4.14
@@ -1224,6 +1247,7 @@ AC_DEFUN([LN_PROG_LINUX_RESULTS], [
        LN_CONFIG_SK_DATA_READY
        # 4.x
        LN_CONFIG_SOCK_CREATE_KERN
+       LN_CONFIG_SOCK_NOT_OWNED_BY_ME
        # 4.6
        LN_ETHTOOL_LINK_SETTINGS
        # 4.14
index 5fd6b39..6a68e40 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/uio.h>
 #include <linux/unistd.h>
 #include <linux/hashtable.h>
+#include <net/net_namespace.h>
 #include <net/sock.h>
 #include <net/tcp.h>
 
index d2ff979..4954905 100644 (file)
@@ -429,10 +429,18 @@ ksocknal_lib_setup_sock(struct socket *sock, struct lnet_ni *ni)
        int keep_intvl;
        int keep_count;
        int do_keepalive;
-       struct tcp_sock *tp = tcp_sk(sock->sk);
+       struct sock     *sk = sock->sk;
+       struct tcp_sock *tp = tcp_sk(sk);
        struct lnet_ioctl_config_socklnd_tunables *lndtun;
+#ifdef HAVE_SOCK_NOT_OWNED_BY_ME
+       struct net      *net = sock_net(sk);
+
+       /* Set sk_net_refcnt and namespace for orphan cleanup LU-18137 */
+       sk->sk_net_refcnt = 1;
+       get_net(net);
+#endif
 
-       sock->sk->sk_allocation = GFP_NOFS;
+       sk->sk_allocation = GFP_NOFS;
 
        /* Ensure this socket aborts active sends immediately when closed. */
        sock_reset_flag(sock->sk, SOCK_LINGER);