From: Mark Roper Date: Sun, 18 Aug 2024 18:25:54 +0000 (+0000) Subject: LU-18137 ksocklnd: Fix TCP socket cleanup X-Git-Tag: 2.15.91~48 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=3367ef3eb29cb989232cfa925b02b89e6638058c;p=fs%2Flustre-release.git LU-18137 ksocklnd: Fix TCP socket cleanup 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 Change-Id: Ib70ba8fcc3f1e49d3afbe788fccd777d02ec39b8 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56089 Reviewed-by: Timothy Day Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin Tested-by: jenkins Tested-by: Maloo --- diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index cb44649..cb4e936 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -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 + ],[ + 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 diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index 5fd6b39..6a68e40 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #include diff --git a/lnet/klnds/socklnd/socklnd_lib.c b/lnet/klnds/socklnd/socklnd_lib.c index d2ff979..4954905 100644 --- a/lnet/klnds/socklnd/socklnd_lib.c +++ b/lnet/klnds/socklnd/socklnd_lib.c @@ -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);