From 01439917a3faee145f46772c4c53063429057c0c 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. Lustre-commit: 15045c9067fd021baa0ec925bcc245949945d01e Lustre-change: https://review.whamcloud.com/27642 Change-Id: I420cda95b70cf927b1a6e3493b631bc5a3585d74 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/27642 Reviewed-by: Doug Oucharek Reviewed-by: Bob Glossman Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin Reviewed-on: https://review.whamcloud.com/28463 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: John L. Hammond --- 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 c360244..2ae3144 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -735,6 +735,27 @@ LB_CHECK_EXPORT([kmap_to_page], [mm/highmem.c], ]) # LN_EXPORT_KMAP_TO_PAG # +# 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 @@ -753,10 +774,12 @@ LN_CONFIG_SK_SLEEP LN_CONFIG_TCP_SENDPAGE # 3.10 LN_EXPORT_KMAP_TO_PAGE -# 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