]) # 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 <linux/net.h>
+],[
+ ((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
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
#
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);
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)