Whamcloud - gitweb
LU-5322 socklnd: handle sk_ready_data change in 3.15+ kernels 59/11059/3
authorJames Simmons <uja.ornl@gmail.com>
Thu, 10 Jul 2014 21:43:59 +0000 (17:43 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 15 Jul 2014 04:01:31 +0000 (04:01 +0000)
Starting with 3.15 kernels the sk_ready_data method in struct
sock only takes a single argument instead of two in earlier
kernels. Support this change in newer kernels.

Change-Id: Ifb740a931f454e806c74065c79ff912ed97e4e10
Signed-off-by: James Simmons <uja.ornl@gmail.com>
Reviewed-on: http://review.whamcloud.com/11059
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Yang Sheng <yang.sheng@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lnet/autoconf/lustre-lnet.m4
lnet/klnds/socklnd/socklnd_lib-linux.c

index 7d6c971..8d81e1c 100644 (file)
@@ -551,6 +551,27 @@ EXTRA_KCFLAGS="$tmp_flags"
 ]) # LN_CONFIG_TCP_SENDPAGE
 
 #
+# LN_CONFIG_SK_DATA_READY
+#
+# 2.6.36 tcp_sendpage() first parameter is 'struct sock' instead of 'struct socket'.
+#
+AC_DEFUN([LN_CONFIG_SK_DATA_READY], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'sk_data_ready' takes only one argument],
+sk_data_ready, [
+       #include <linux/net.h>
+       #include <net/sock.h>
+],[
+       ((struct sock *)0)->sk_data_ready(NULL);
+],[
+       AC_DEFINE(HAVE_SK_DATA_READY_ONE_ARG, 1,
+               [sk_data_ready uses only one argument])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LN_CONFIG_SK_DATA_READY
+
+#
 # LN_PROG_LINUX
 #
 # LNet linux kernel checks
@@ -569,6 +590,8 @@ LN_CONFIG_GNILND
 LN_CONFIG_MX
 # 2.6.36
 LN_CONFIG_TCP_SENDPAGE
+# 3.15
+LN_CONFIG_SK_DATA_READY
 ]) # LN_PROG_LINUX
 
 #
index 33ad490..2815a36 100644 (file)
@@ -959,25 +959,33 @@ extern void ksocknal_write_callback (ksock_conn_t *conn);
  * socket call back in Linux
  */
 static void
-ksocknal_data_ready (struct sock *sk, int n)
+#ifdef HAVE_SK_DATA_READY_ONE_ARG
+ksocknal_data_ready(struct sock *sk)
+#else
+ksocknal_data_ready(struct sock *sk, int n)
+#endif
 {
-        ksock_conn_t  *conn;
-        ENTRY;
+       ksock_conn_t  *conn;
+       ENTRY;
 
         /* interleave correctly with closing sockets... */
         LASSERT(!in_irq());
        read_lock(&ksocknal_data.ksnd_global_lock);
 
-        conn = sk->sk_user_data;
-        if (conn == NULL) {             /* raced with ksocknal_terminate_conn */
-                LASSERT (sk->sk_data_ready != &ksocknal_data_ready);
-                sk->sk_data_ready (sk, n);
-        } else
-                ksocknal_read_callback(conn);
+       conn = sk->sk_user_data;
+       if (conn == NULL) {     /* raced with ksocknal_terminate_conn */
+               LASSERT(sk->sk_data_ready != &ksocknal_data_ready);
+#ifdef HAVE_SK_DATA_READY_ONE_ARG
+               sk->sk_data_ready(sk);
+#else
+               sk->sk_data_ready(sk, n);
+#endif
+       } else
+               ksocknal_read_callback(conn);
 
        read_unlock(&ksocknal_data.ksnd_global_lock);
 
-        EXIT;
+       EXIT;
 }
 
 static void