From 15045c9067fd021baa0ec925bcc245949945d01e Mon Sep 17 00:00:00 2001 From: James Simmons Date: Wed, 14 Jun 2017 12:42:52 -0400 Subject: [PATCH] LU-9558 lnet: kernel socket accept takes new bool agrument During the development of the linux 4.11 kernel it was discovered that the kernel socket layer could get into lockdep situation. To handle this a new bool argument was added to the accept member of struct socket. For LNet we can always pass false. Change-Id: I420cda95b70cf927b1a6e3493b631bc5a3585d74 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/27642 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Doug Oucharek Reviewed-by: Bob Glossman Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- lnet/autoconf/lustre-lnet.m4 | 27 +++++++++++++++++++++++++-- lnet/lnet/lib-socket.c | 8 ++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index 1123672..5fa1a70 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -724,6 +724,27 @@ EXTRA_KCFLAGS="$tmp_flags" ]) # LN_CONFIG_SK_DATA_READY # +# LN_CONFIG_SOCK_ACCEPT +# +# 4.11 commit cdfbabfb2f0ce983fdaa42f20e5f7842178fc01e added a flag +# to handle a possible lockdep condition kernel socket accept. +# +AC_DEFUN([LN_CONFIG_SOCK_ACCEPT], [ +tmp_flags="$EXTRA_KCFLAGS" +EXTRA_KCFLAGS="-Werror" +LB_CHECK_COMPILE([if 'struct sock' accept function requires a bool argument], +kern_sock_flag, [ + #include +],[ + ((struct socket *)0)->ops->accept(NULL, NULL, O_NONBLOCK, false); +],[ + AC_DEFINE(HAVE_KERN_SOCK_ACCEPT_FLAG_ARG, 1, + ['struct sock' accept function requires bool argument]) +]) +EXTRA_KCFLAGS="$tmp_flags" +]) # LN_CONFIG_SOCK_ACCEPT + +# # LN_PROG_LINUX # # LNet linux kernel checks @@ -740,10 +761,12 @@ LN_CONFIG_GNILND LN_CONFIG_SK_SLEEP # 2.6.36 LN_CONFIG_TCP_SENDPAGE -# 4.x -LN_CONFIG_SOCK_CREATE_KERN # 3.15 LN_CONFIG_SK_DATA_READY +# 4.x +LN_CONFIG_SOCK_CREATE_KERN +# 4.11 +LN_CONFIG_SOCK_ACCEPT ]) # LN_PROG_LINUX # diff --git a/lnet/lnet/lib-socket.c b/lnet/lnet/lib-socket.c index 4eaaf6c..57678b3 100644 --- a/lnet/lnet/lib-socket.c +++ b/lnet/lnet/lib-socket.c @@ -582,7 +582,11 @@ lnet_sock_accept(struct socket **newsockp, struct socket *sock) newsock->ops = sock->ops; +#ifdef HAVE_KERN_SOCK_ACCEPT_FLAG_ARG + rc = sock->ops->accept(sock, newsock, O_NONBLOCK, false); +#else rc = sock->ops->accept(sock, newsock, O_NONBLOCK); +#endif if (rc == -EAGAIN) { /* Nothing ready, so wait for activity */ init_waitqueue_entry(&wait, current); @@ -590,7 +594,11 @@ lnet_sock_accept(struct socket **newsockp, struct socket *sock) set_current_state(TASK_INTERRUPTIBLE); schedule(); remove_wait_queue(sk_sleep(sock->sk), &wait); +#ifdef HAVE_KERN_SOCK_ACCEPT_FLAG_ARG + rc = sock->ops->accept(sock, newsock, O_NONBLOCK, false); +#else rc = sock->ops->accept(sock, newsock, O_NONBLOCK); +#endif } if (rc != 0) -- 1.8.3.1