Whamcloud - gitweb
LU-5322 socklnd: handle sk_ready_data change in 3.15+ kernels
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd_lib-linux.c
index fa66f21..2815a36 100644 (file)
 
 # if defined(CONFIG_SYSCTL) && !CFS_SYSFS_MODULE_PARM
 
-#ifndef HAVE_SYSCTL_UNNUMBERED
-
-enum {
-        SOCKLND_TIMEOUT = 1,
-        SOCKLND_CREDITS,
-        SOCKLND_PEER_TXCREDITS,
-        SOCKLND_PEER_RTRCREDITS,
-        SOCKLND_PEER_TIMEOUT,
-        SOCKLND_NCONNDS,
-        SOCKLND_RECONNECTS_MIN,
-        SOCKLND_RECONNECTS_MAX,
-        SOCKLND_EAGER_ACK,
-        SOCKLND_ZERO_COPY,
-        SOCKLND_TYPED,
-        SOCKLND_BULK_MIN,
-        SOCKLND_RX_BUFFER_SIZE,
-        SOCKLND_TX_BUFFER_SIZE,
-        SOCKLND_NAGLE,
-        SOCKLND_IRQ_AFFINITY,
-        SOCKLND_ROUND_ROBIN,
-        SOCKLND_KEEPALIVE,
-        SOCKLND_KEEPALIVE_IDLE,
-        SOCKLND_KEEPALIVE_COUNT,
-        SOCKLND_KEEPALIVE_INTVL,
-        SOCKLND_BACKOFF_INIT,
-        SOCKLND_BACKOFF_MAX,
-        SOCKLND_PROTOCOL,
-        SOCKLND_ZERO_COPY_RECV,
-        SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS
-};
-#else
-
-#define SOCKLND_TIMEOUT         CTL_UNNUMBERED
-#define SOCKLND_CREDITS         CTL_UNNUMBERED
-#define SOCKLND_PEER_TXCREDITS  CTL_UNNUMBERED
-#define SOCKLND_PEER_RTRCREDITS  CTL_UNNUMBERED
-#define SOCKLND_PEER_TIMEOUT    CTL_UNNUMBERED
-#define SOCKLND_NCONNDS         CTL_UNNUMBERED
-#define SOCKLND_RECONNECTS_MIN  CTL_UNNUMBERED
-#define SOCKLND_RECONNECTS_MAX  CTL_UNNUMBERED
-#define SOCKLND_EAGER_ACK       CTL_UNNUMBERED
-#define SOCKLND_ZERO_COPY       CTL_UNNUMBERED
-#define SOCKLND_TYPED           CTL_UNNUMBERED
-#define SOCKLND_BULK_MIN        CTL_UNNUMBERED
-#define SOCKLND_RX_BUFFER_SIZE  CTL_UNNUMBERED
-#define SOCKLND_TX_BUFFER_SIZE  CTL_UNNUMBERED
-#define SOCKLND_NAGLE           CTL_UNNUMBERED
-#define SOCKLND_IRQ_AFFINITY    CTL_UNNUMBERED
-#define SOCKLND_ROUND_ROBIN     CTL_UNNUMBERED
-#define SOCKLND_KEEPALIVE       CTL_UNNUMBERED
-#define SOCKLND_KEEPALIVE_IDLE  CTL_UNNUMBERED
-#define SOCKLND_KEEPALIVE_COUNT CTL_UNNUMBERED
-#define SOCKLND_KEEPALIVE_INTVL CTL_UNNUMBERED
-#define SOCKLND_BACKOFF_INIT    CTL_UNNUMBERED
-#define SOCKLND_BACKOFF_MAX     CTL_UNNUMBERED
-#define SOCKLND_PROTOCOL        CTL_UNNUMBERED
-#define SOCKLND_ZERO_COPY_RECV  CTL_UNNUMBERED
-#define SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS CTL_UNNUMBERED
-#endif
-
 static struct ctl_table ksocknal_ctl_table[] = {
-        {
-                .ctl_name = SOCKLND_TIMEOUT,
-                .procname = "timeout",
-                .data     = &ksocknal_tunables.ksnd_timeout,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_CREDITS,
-                .procname = "credits",
-                .data     = &ksocknal_tunables.ksnd_credits,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-         {
-                .ctl_name = SOCKLND_PEER_TXCREDITS,
-                .procname = "peer_credits",
-                .data     = &ksocknal_tunables.ksnd_peertxcredits,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-         {
-                .ctl_name = SOCKLND_PEER_RTRCREDITS,
-                .procname = "peer_buffer_credits",
-                .data     = &ksocknal_tunables.ksnd_peerrtrcredits,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_PEER_TIMEOUT,
-                .procname = "peer_timeout",
-                .data     = &ksocknal_tunables.ksnd_peertimeout,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_NCONNDS,
-                .procname = "nconnds",
-                .data     = &ksocknal_tunables.ksnd_nconnds,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_RECONNECTS_MIN,
-                .procname = "min_reconnectms",
-                .data     = &ksocknal_tunables.ksnd_min_reconnectms,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_RECONNECTS_MAX,
-                .procname = "max_reconnectms",
-                .data     = &ksocknal_tunables.ksnd_max_reconnectms,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_EAGER_ACK,
-                .procname = "eager_ack",
-                .data     = &ksocknal_tunables.ksnd_eager_ack,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_ZERO_COPY,
-                .procname = "zero_copy",
-                .data     = &ksocknal_tunables.ksnd_zc_min_payload,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_ZERO_COPY_RECV,
-                .procname = "zero_copy_recv",
-                .data     = &ksocknal_tunables.ksnd_zc_recv,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-
-        {
-                .ctl_name = SOCKLND_ZERO_COPY_RECV_MIN_NFRAGS,
-                .procname = "zero_copy_recv",
-                .data     = &ksocknal_tunables.ksnd_zc_recv_min_nfrags,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_TYPED,
-                .procname = "typed",
-                .data     = &ksocknal_tunables.ksnd_typed_conns,
-                .maxlen   = sizeof (int),
-                .mode     = 0444,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_BULK_MIN,
-                .procname = "min_bulk",
-                .data     = &ksocknal_tunables.ksnd_min_bulk,
-                .maxlen   = sizeof (int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_RX_BUFFER_SIZE,
-                .procname = "rx_buffer_size",
-                .data     = &ksocknal_tunables.ksnd_rx_buffer_size,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_TX_BUFFER_SIZE,
-                .procname = "tx_buffer_size",
-                .data     = &ksocknal_tunables.ksnd_tx_buffer_size,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_NAGLE,
-                .procname = "nagle",
-                .data     = &ksocknal_tunables.ksnd_nagle,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+       {
+               INIT_CTL_NAME
+               .procname       = "timeout",
+               .data           = &ksocknal_tunables.ksnd_timeout,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "credits",
+               .data           = &ksocknal_tunables.ksnd_credits,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "peer_credits",
+               .data           = &ksocknal_tunables.ksnd_peertxcredits,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "peer_buffer_credits",
+               .data           = &ksocknal_tunables.ksnd_peerrtrcredits,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "peer_timeout",
+               .data           = &ksocknal_tunables.ksnd_peertimeout,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "nconnds",
+               .data           = &ksocknal_tunables.ksnd_nconnds,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "min_reconnectms",
+               .data           = &ksocknal_tunables.ksnd_min_reconnectms,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "max_reconnectms",
+               .data           = &ksocknal_tunables.ksnd_max_reconnectms,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "eager_ack",
+               .data           = &ksocknal_tunables.ksnd_eager_ack,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "zero_copy",
+               .data           = &ksocknal_tunables.ksnd_zc_min_payload,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "zero_copy_recv",
+               .data           = &ksocknal_tunables.ksnd_zc_recv,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "zero_copy_recv",
+               .data           = &ksocknal_tunables.ksnd_zc_recv_min_nfrags,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "typed",
+               .data           = &ksocknal_tunables.ksnd_typed_conns,
+               .maxlen         = sizeof (int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "min_bulk",
+               .data           = &ksocknal_tunables.ksnd_min_bulk,
+               .maxlen         = sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "rx_buffer_size",
+               .data           = &ksocknal_tunables.ksnd_rx_buffer_size,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "tx_buffer_size",
+               .data           = &ksocknal_tunables.ksnd_tx_buffer_size,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "nagle",
+               .data           = &ksocknal_tunables.ksnd_nagle,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
 #ifdef CPU_AFFINITY
-        {
-                .ctl_name = SOCKLND_IRQ_AFFINITY,
-                .procname = "irq_affinity",
-                .data     = &ksocknal_tunables.ksnd_irq_affinity,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+       {
+               INIT_CTL_NAME
+               .procname       = "irq_affinity",
+               .data           = &ksocknal_tunables.ksnd_irq_affinity,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
 #endif
-        {
-                .ctl_name = SOCKLND_ROUND_ROBIN,
-                .procname = "round_robin",
-                .data     = &ksocknal_tunables.ksnd_round_robin,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_KEEPALIVE,
-                .procname = "keepalive",
-                .data     = &ksocknal_tunables.ksnd_keepalive,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_KEEPALIVE_IDLE,
-                .procname = "keepalive_idle",
-                .data     = &ksocknal_tunables.ksnd_keepalive_idle,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_KEEPALIVE_COUNT,
-                .procname = "keepalive_count",
-                .data     = &ksocknal_tunables.ksnd_keepalive_count,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_KEEPALIVE_INTVL,
-                .procname = "keepalive_intvl",
-                .data     = &ksocknal_tunables.ksnd_keepalive_intvl,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+       {
+               INIT_CTL_NAME
+               .procname       = "round_robin",
+               .data           = &ksocknal_tunables.ksnd_round_robin,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "keepalive",
+               .data           = &ksocknal_tunables.ksnd_keepalive,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "keepalive_idle",
+               .data           = &ksocknal_tunables.ksnd_keepalive_idle,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "keepalive_count",
+               .data           = &ksocknal_tunables.ksnd_keepalive_count,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "keepalive_intvl",
+               .data           = &ksocknal_tunables.ksnd_keepalive_intvl,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
 #ifdef SOCKNAL_BACKOFF
-        {
-                .ctl_name = SOCKLND_BACKOFF_INIT,
-                .procname = "backoff_init",
-                .data     = &ksocknal_tunables.ksnd_backoff_init,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = SOCKLND_BACKOFF_MAX,
-                .procname = "backoff_max",
-                .data     = &ksocknal_tunables.ksnd_backoff_max,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+       {
+               INIT_CTL_NAME
+               .procname       = "backoff_init",
+               .data           = &ksocknal_tunables.ksnd_backoff_init,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
+       {
+               INIT_CTL_NAME
+               .procname       = "backoff_max",
+               .data           = &ksocknal_tunables.ksnd_backoff_max,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
 #endif
 #if SOCKNAL_VERSION_DEBUG
-        {
-                .ctl_name = SOCKLND_PROTOCOL,
-                .procname = "protocol",
-                .data     = &ksocknal_tunables.ksnd_protocol,
-                .maxlen   = sizeof(int),
-                .mode     = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+       {
+               INIT_CTL_NAME
+               .procname       = "protocol",
+               .data           = &ksocknal_tunables.ksnd_protocol,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               INIT_STRATEGY
+       },
 #endif
-        {0}
+       { 0 }
 };
 
-
 struct ctl_table ksocknal_top_ctl_table[] = {
-        {
-                .ctl_name = CTL_SOCKLND,
-                .procname = "socknal",
-                .data     = NULL,
-                .maxlen   = 0,
-                .mode     = 0555,
-                .child    = ksocknal_ctl_table
-        },
-        { 0 }
+       {
+               INIT_CTL_NAME
+               .procname       = "socknal",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0555,
+               .child          = ksocknal_ctl_table
+       },
+       { 0 }
 };
 
 int
@@ -443,60 +381,50 @@ ksocknal_lib_zc_capable(ksock_conn_t *conn)
 }
 
 int
-ksocknal_lib_send_iov (ksock_conn_t *conn, ksock_tx_t *tx)
+ksocknal_lib_send_iov(ksock_conn_t *conn, ksock_tx_t *tx)
 {
-        struct socket *sock = conn->ksnc_sock;
-        int            nob;
-        int            rc;
+       struct socket  *sock = conn->ksnc_sock;
+       int             nob;
+       int             rc;
 
-        if (*ksocknal_tunables.ksnd_enable_csum        && /* checksum enabled */
-            conn->ksnc_proto == &ksocknal_protocol_v2x && /* V2.x connection  */
-            tx->tx_nob == tx->tx_resid                 && /* frist sending    */
-            tx->tx_msg.ksm_csum == 0)                     /* not checksummed  */
-                ksocknal_lib_csum_tx(tx);
+       if (*ksocknal_tunables.ksnd_enable_csum        && /* checksum enabled */
+           conn->ksnc_proto == &ksocknal_protocol_v2x && /* V2.x connection  */
+           tx->tx_nob == tx->tx_resid                 && /* frist sending    */
+           tx->tx_msg.ksm_csum == 0)                     /* not checksummed  */
+               ksocknal_lib_csum_tx(tx);
 
-        /* NB we can't trust socket ops to either consume our iovs
-         * or leave them alone. */
+       /* NB we can't trust socket ops to either consume our iovs
+        * or leave them alone. */
 
-        {
+       {
 #if SOCKNAL_SINGLE_FRAG_TX
-                struct iovec    scratch;
-                struct iovec   *scratchiov = &scratch;
-                unsigned int    niov = 1;
+               struct iovec    scratch;
+               struct iovec   *scratchiov = &scratch;
+               unsigned int    niov = 1;
 #else
                 struct iovec   *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
-                unsigned int    niov = tx->tx_niov;
+               unsigned int    niov = tx->tx_niov;
 #endif
-                struct msghdr msg = {
-                        .msg_name       = NULL,
-                        .msg_namelen    = 0,
-                        .msg_iov        = scratchiov,
-                        .msg_iovlen     = niov,
-                        .msg_control    = NULL,
-                        .msg_controllen = 0,
-                        .msg_flags      = MSG_DONTWAIT
-                };
-                mm_segment_t oldmm = get_fs();
+               struct msghdr msg = { .msg_flags = MSG_DONTWAIT };
                 int  i;
 
-                for (nob = i = 0; i < niov; i++) {
-                        scratchiov[i] = tx->tx_iov[i];
-                        nob += scratchiov[i].iov_len;
-                }
+               for (nob = i = 0; i < niov; i++) {
+                       scratchiov[i] = tx->tx_iov[i];
+                       nob += scratchiov[i].iov_len;
+               }
 
-                if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
-                    nob < tx->tx_resid)
-                        msg.msg_flags |= MSG_MORE;
+               if (!list_empty(&conn->ksnc_tx_queue) ||
+                   nob < tx->tx_resid)
+                       msg.msg_flags |= MSG_MORE;
 
-                set_fs (KERNEL_DS);
-                rc = sock_sendmsg(sock, &msg, nob);
-                set_fs (oldmm);
-        }
-        return rc;
+               rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov,
+                                   niov, nob);
+       }
+       return rc;
 }
 
 int
-ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx)
+ksocknal_lib_send_kiov(ksock_conn_t *conn, ksock_tx_t *tx)
 {
         struct socket *sock = conn->ksnc_sock;
         lnet_kiov_t   *kiov = tx->tx_kiov;
@@ -519,7 +447,7 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx)
                 CDEBUG(D_NET, "page %p + offset %x for %d\n",
                                page, offset, kiov->kiov_len);
 
-                if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
+               if (!list_empty(&conn->ksnc_tx_queue) ||
                     fragsize < tx->tx_resid)
                         msgflg |= MSG_MORE;
 
@@ -532,46 +460,35 @@ ksocknal_lib_send_kiov (ksock_conn_t *conn, ksock_tx_t *tx)
                 }
         } else {
 #if SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_RISK_KMAP_DEADLOCK
-                struct iovec  scratch;
-                struct iovec *scratchiov = &scratch;
-                unsigned int  niov = 1;
+               struct iovec    scratch;
+               struct iovec   *scratchiov = &scratch;
+               unsigned int    niov = 1;
 #else
 #ifdef CONFIG_HIGHMEM
 #warning "XXX risk of kmap deadlock on multiple frags..."
 #endif
-                struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
-                unsigned int  niov = tx->tx_nkiov;
+               struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
+               unsigned int  niov = tx->tx_nkiov;
 #endif
-                struct msghdr msg = {
-                        .msg_name       = NULL,
-                        .msg_namelen    = 0,
-                        .msg_iov        = scratchiov,
-                        .msg_iovlen     = niov,
-                        .msg_control    = NULL,
-                        .msg_controllen = 0,
-                        .msg_flags      = MSG_DONTWAIT
-                };
-                mm_segment_t  oldmm = get_fs();
-                int           i;
-
-                for (nob = i = 0; i < niov; i++) {
-                        scratchiov[i].iov_base = kmap(kiov[i].kiov_page) +
-                                                 kiov[i].kiov_offset;
-                        nob += scratchiov[i].iov_len = kiov[i].kiov_len;
-                }
+               struct msghdr msg = { .msg_flags = MSG_DONTWAIT };
+               int           i;
 
-                if (!cfs_list_empty(&conn->ksnc_tx_queue) ||
-                    nob < tx->tx_resid)
-                        msg.msg_flags |= MSG_MORE;
+               for (nob = i = 0; i < niov; i++) {
+                       scratchiov[i].iov_base = kmap(kiov[i].kiov_page) +
+                                                kiov[i].kiov_offset;
+                       nob += scratchiov[i].iov_len = kiov[i].kiov_len;
+               }
 
-                set_fs (KERNEL_DS);
-                rc = sock_sendmsg(sock, &msg, nob);
-                set_fs (oldmm);
+               if (!list_empty(&conn->ksnc_tx_queue) ||
+                   nob < tx->tx_resid)
+                       msg.msg_flags |= MSG_MORE;
 
-                for (i = 0; i < niov; i++)
-                        kunmap(kiov[i].kiov_page);
-        }
-        return rc;
+               rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov, niov, nob);
+
+               for (i = 0; i < niov; i++)
+                       kunmap(kiov[i].kiov_page);
+       }
+       return rc;
 }
 
 void
@@ -596,24 +513,17 @@ int
 ksocknal_lib_recv_iov (ksock_conn_t *conn)
 {
 #if SOCKNAL_SINGLE_FRAG_RX
-        struct iovec  scratch;
-        struct iovec *scratchiov = &scratch;
-        unsigned int  niov = 1;
+       struct iovec  scratch;
+       struct iovec *scratchiov = &scratch;
+       unsigned int  niov = 1;
 #else
-        struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
-        unsigned int  niov = conn->ksnc_rx_niov;
+       struct iovec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
+       unsigned int  niov = conn->ksnc_rx_niov;
 #endif
-        struct iovec *iov = conn->ksnc_rx_iov;
-        struct msghdr msg = {
-                .msg_name       = NULL,
-                .msg_namelen    = 0,
-                .msg_iov        = scratchiov,
-                .msg_iovlen     = niov,
-                .msg_control    = NULL,
-                .msg_controllen = 0,
-                .msg_flags      = 0
-        };
-        mm_segment_t oldmm = get_fs();
+       struct iovec *iov = conn->ksnc_rx_iov;
+       struct msghdr msg = {
+               .msg_flags      = 0
+       };
         int          nob;
         int          i;
         int          rc;
@@ -631,10 +541,8 @@ ksocknal_lib_recv_iov (ksock_conn_t *conn)
         }
         LASSERT (nob <= conn->ksnc_rx_nob_wanted);
 
-        set_fs (KERNEL_DS);
-        rc = sock_recvmsg (conn->ksnc_sock, &msg, nob, MSG_DONTWAIT);
-        /* NB this is just a boolean..........................^ */
-        set_fs (oldmm);
+       rc = kernel_recvmsg(conn->ksnc_sock, &msg,
+               (struct kvec *)scratchiov, niov, nob, MSG_DONTWAIT);
 
         saved_csum = 0;
         if (conn->ksnc_proto == &ksocknal_protocol_v2x) {
@@ -718,20 +626,14 @@ ksocknal_lib_recv_kiov (ksock_conn_t *conn)
 #ifdef CONFIG_HIGHMEM
 #warning "XXX risk of kmap deadlock on multiple frags..."
 #endif
-        struct iovec  *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
-        struct page  **pages      = conn->ksnc_scheduler->kss_rx_scratch_pgs;
-        unsigned int   niov       = conn->ksnc_rx_nkiov;
+       struct iovec  *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
+       struct page  **pages      = conn->ksnc_scheduler->kss_rx_scratch_pgs;
+       unsigned int   niov       = conn->ksnc_rx_nkiov;
 #endif
-        lnet_kiov_t   *kiov = conn->ksnc_rx_kiov;
-        struct msghdr msg = {
-                .msg_name       = NULL,
-                .msg_namelen    = 0,
-                .msg_iov        = scratchiov,
-                .msg_control    = NULL,
-                .msg_controllen = 0,
-                .msg_flags      = 0
-        };
-        mm_segment_t oldmm = get_fs();
+       lnet_kiov_t   *kiov = conn->ksnc_rx_kiov;
+       struct msghdr msg = {
+               .msg_flags      = 0
+       };
         int          nob;
         int          i;
         int          rc;
@@ -739,28 +641,27 @@ ksocknal_lib_recv_kiov (ksock_conn_t *conn)
         void        *addr;
         int          sum;
         int          fragnob;
+       int n;
 
         /* NB we can't trust socket ops to either consume our iovs
          * or leave them alone. */
-        if ((addr = ksocknal_lib_kiov_vmap(kiov, niov, scratchiov, pages)) != NULL) {
-                nob = scratchiov[0].iov_len;
-                msg.msg_iovlen = 1;
-
-        } else {
-                for (nob = i = 0; i < niov; i++) {
-                        nob += scratchiov[i].iov_len = kiov[i].kiov_len;
-                        scratchiov[i].iov_base = kmap(kiov[i].kiov_page) +
-                                                 kiov[i].kiov_offset;
-                }
-                msg.msg_iovlen = niov;
-        }
+       if ((addr = ksocknal_lib_kiov_vmap(kiov, niov, scratchiov, pages)) != NULL) {
+               nob = scratchiov[0].iov_len;
+               n = 1;
+
+       } else {
+               for (nob = i = 0; i < niov; i++) {
+                       nob += scratchiov[i].iov_len = kiov[i].kiov_len;
+                       scratchiov[i].iov_base = kmap(kiov[i].kiov_page) +
+                                                kiov[i].kiov_offset;
+               }
+               n = niov;
+       }
 
-        LASSERT (nob <= conn->ksnc_rx_nob_wanted);
+       LASSERT (nob <= conn->ksnc_rx_nob_wanted);
 
-        set_fs (KERNEL_DS);
-        rc = sock_recvmsg (conn->ksnc_sock, &msg, nob, MSG_DONTWAIT);
-        /* NB this is just a boolean.......................^ */
-        set_fs (oldmm);
+       rc = kernel_recvmsg(conn->ksnc_sock, &msg,
+                       (struct kvec *)scratchiov, n, nob, MSG_DONTWAIT);
 
         if (conn->ksnc_msg.ksm_csum != 0) {
                 for (i = 0, sum = rc; sum > 0; i++, sum -= fragnob) {
@@ -1058,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
@@ -1100,7 +1009,7 @@ ksocknal_write_space (struct sock *sk)
                                       " ready" : " blocked"),
                (conn == NULL) ? "" : (conn->ksnc_tx_scheduled ?
                                       " scheduled" : " idle"),
-               (conn == NULL) ? "" : (cfs_list_empty (&conn->ksnc_tx_queue) ?
+              (conn == NULL) ? "" : (list_empty(&conn->ksnc_tx_queue) ?
                                       " empty" : " queued"));
 
         if (conn == NULL) {             /* raced with ksocknal_terminate_conn */