Whamcloud - gitweb
LU-9448 lnet: handle empty CPTs
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd.c
index f27a8ce..0fdedba 100644 (file)
 #include <linux/pci.h>
 #include "socklnd.h"
 
-static lnd_t                   the_ksocklnd;
+static struct lnet_lnd the_ksocklnd;
 ksock_nal_data_t        ksocknal_data;
 
 static ksock_interface_t *
-ksocknal_ip2iface(lnet_ni_t *ni, __u32 ip)
+ksocknal_ip2iface(struct lnet_ni *ni, __u32 ip)
 {
-        ksock_net_t       *net = ni->ni_data;
-        int                i;
-        ksock_interface_t *iface;
+       ksock_net_t *net = ni->ni_data;
+       int i;
+       ksock_interface_t *iface;
 
-        for (i = 0; i < net->ksnn_ninterfaces; i++) {
-                LASSERT(i < LNET_MAX_INTERFACES);
-                iface = &net->ksnn_interfaces[i];
+       for (i = 0; i < net->ksnn_ninterfaces; i++) {
+               LASSERT(i < LNET_NUM_INTERFACES);
+               iface = &net->ksnn_interfaces[i];
 
-                if (iface->ksni_ipaddr == ip)
-                        return (iface);
-        }
+               if (iface->ksni_ipaddr == ip)
+                       return iface;
+       }
 
-        return (NULL);
+       return NULL;
 }
 
 static ksock_route_t *
@@ -97,7 +97,8 @@ ksocknal_destroy_route (ksock_route_t *route)
 }
 
 static int
-ksocknal_create_peer(ksock_peer_ni_t **peerp, lnet_ni_t *ni, lnet_process_id_t id)
+ksocknal_create_peer(ksock_peer_ni_t **peerp, struct lnet_ni *ni,
+                    struct lnet_process_id id)
 {
        int             cpt = lnet_cpt_of_nid(id.nid, ni);
        ksock_net_t     *net = ni->ni_data;
@@ -171,7 +172,7 @@ ksocknal_destroy_peer (ksock_peer_ni_t *peer_ni)
 }
 
 ksock_peer_ni_t *
-ksocknal_find_peer_locked (lnet_ni_t *ni, lnet_process_id_t id)
+ksocknal_find_peer_locked(struct lnet_ni *ni, struct lnet_process_id id)
 {
        struct list_head *peer_list = ksocknal_nid2peerlist(id.nid);
        struct list_head *tmp;
@@ -199,7 +200,7 @@ ksocknal_find_peer_locked (lnet_ni_t *ni, lnet_process_id_t id)
 }
 
 ksock_peer_ni_t *
-ksocknal_find_peer (lnet_ni_t *ni, lnet_process_id_t id)
+ksocknal_find_peer(struct lnet_ni *ni, struct lnet_process_id id)
 {
         ksock_peer_ni_t     *peer_ni;
 
@@ -213,25 +214,27 @@ ksocknal_find_peer (lnet_ni_t *ni, lnet_process_id_t id)
 }
 
 static void
-ksocknal_unlink_peer_locked (ksock_peer_ni_t *peer_ni)
+ksocknal_unlink_peer_locked(ksock_peer_ni_t *peer_ni)
 {
-        int                i;
-        __u32              ip;
-        ksock_interface_t *iface;
+       int i;
+       __u32 ip;
+       ksock_interface_t *iface;
 
-        for (i = 0; i < peer_ni->ksnp_n_passive_ips; i++) {
-                LASSERT (i < LNET_MAX_INTERFACES);
-                ip = peer_ni->ksnp_passive_ips[i];
+       for (i = 0; i < peer_ni->ksnp_n_passive_ips; i++) {
+               LASSERT(i < LNET_NUM_INTERFACES);
+               ip = peer_ni->ksnp_passive_ips[i];
 
-                iface = ksocknal_ip2iface(peer_ni->ksnp_ni, ip);
-                /* All IPs in peer_ni->ksnp_passive_ips[] come from the
-                 * interface list, therefore the call must succeed. */
-                LASSERT (iface != NULL);
+               iface = ksocknal_ip2iface(peer_ni->ksnp_ni, ip);
+               /*
+                * All IPs in peer_ni->ksnp_passive_ips[] come from the
+                * interface list, therefore the call must succeed.
+                */
+               LASSERT(iface != NULL);
 
-                CDEBUG(D_NET, "peer_ni=%p iface=%p ksni_nroutes=%d\n",
-                       peer_ni, iface, iface->ksni_nroutes);
-                iface->ksni_npeers--;
-        }
+               CDEBUG(D_NET, "peer_ni=%p iface=%p ksni_nroutes=%d\n",
+                      peer_ni, iface, iface->ksni_nroutes);
+               iface->ksni_npeers--;
+       }
 
        LASSERT(list_empty(&peer_ni->ksnp_conns));
        LASSERT(list_empty(&peer_ni->ksnp_routes));
@@ -243,9 +246,9 @@ ksocknal_unlink_peer_locked (ksock_peer_ni_t *peer_ni)
 }
 
 static int
-ksocknal_get_peer_info (lnet_ni_t *ni, int index,
-                        lnet_process_id_t *id, __u32 *myip, __u32 *peer_ip,
-                        int *port, int *conn_count, int *share_count)
+ksocknal_get_peer_info(struct lnet_ni *ni, int index,
+                      struct lnet_process_id *id, __u32 *myip, __u32 *peer_ip,
+                      int *port, int *conn_count, int *share_count)
 {
        ksock_peer_ni_t   *peer_ni;
        struct list_head  *ptmp;
@@ -442,7 +445,8 @@ ksocknal_del_route_locked (ksock_route_t *route)
 }
 
 int
-ksocknal_add_peer(lnet_ni_t *ni, lnet_process_id_t id, __u32 ipaddr, int port)
+ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id, __u32 ipaddr,
+                 int port)
 {
        struct list_head *tmp;
        ksock_peer_ni_t  *peer_ni;
@@ -559,7 +563,7 @@ ksocknal_del_peer_locked (ksock_peer_ni_t *peer_ni, __u32 ip)
 }
 
 static int
-ksocknal_del_peer (lnet_ni_t *ni, lnet_process_id_t id, __u32 ip)
+ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id, __u32 ip)
 {
        struct list_head  zombies = LIST_HEAD_INIT(zombies);
        struct list_head *ptmp;
@@ -616,13 +620,13 @@ ksocknal_del_peer (lnet_ni_t *ni, lnet_process_id_t id, __u32 ip)
 
        write_unlock_bh(&ksocknal_data.ksnd_global_lock);
 
-       ksocknal_txlist_done(ni, &zombies, 1);
+       ksocknal_txlist_done(ni, &zombies, -ENETDOWN);
 
        return rc;
 }
 
 static ksock_conn_t *
-ksocknal_get_conn_by_idx (lnet_ni_t *ni, int index)
+ksocknal_get_conn_by_idx(struct lnet_ni *ni, int index)
 {
        ksock_peer_ni_t  *peer_ni;
        struct list_head *ptmp;
@@ -666,8 +670,18 @@ ksocknal_choose_scheduler_locked(unsigned int cpt)
        ksock_sched_t           *sched;
        int                     i;
 
-       LASSERT(info->ksi_nthreads > 0);
+       if (info->ksi_nthreads == 0) {
+               cfs_percpt_for_each(info, i, ksocknal_data.ksnd_sched_info) {
+                       if (info->ksi_nthreads > 0) {
+                               CDEBUG(D_NET, "scheduler[%d] has no threads. selected scheduler[%d]\n",
+                                      cpt, info->ksi_cpt);
+                               goto select_sched;
+                       }
+               }
+               return NULL;
+       }
 
+select_sched:
        sched = &info->ksi_scheds[0];
        /*
         * NB: it's safe so far, but info->ksi_nthreads could be changed
@@ -683,31 +697,33 @@ ksocknal_choose_scheduler_locked(unsigned int cpt)
 }
 
 static int
-ksocknal_local_ipvec (lnet_ni_t *ni, __u32 *ipaddrs)
+ksocknal_local_ipvec(struct lnet_ni *ni, __u32 *ipaddrs)
 {
-        ksock_net_t       *net = ni->ni_data;
-        int                i;
-        int                nip;
+       ksock_net_t *net = ni->ni_data;
+       int i;
+       int nip;
 
        read_lock(&ksocknal_data.ksnd_global_lock);
 
-        nip = net->ksnn_ninterfaces;
-        LASSERT (nip <= LNET_MAX_INTERFACES);
+       nip = net->ksnn_ninterfaces;
+       LASSERT(nip <= LNET_NUM_INTERFACES);
 
-       /* Only offer interfaces for additional connections if I have
-         * more than one. */
-        if (nip < 2) {
+       /*
+        * Only offer interfaces for additional connections if I have
+        * more than one.
+        */
+       if (nip < 2) {
                read_unlock(&ksocknal_data.ksnd_global_lock);
-                return 0;
-        }
+               return 0;
+       }
 
-        for (i = 0; i < nip; i++) {
-                ipaddrs[i] = net->ksnn_interfaces[i].ksni_ipaddr;
-                LASSERT (ipaddrs[i] != 0);
-        }
+       for (i = 0; i < nip; i++) {
+               ipaddrs[i] = net->ksnn_interfaces[i].ksni_ipaddr;
+               LASSERT(ipaddrs[i] != 0);
+       }
 
        read_unlock(&ksocknal_data.ksnd_global_lock);
-        return (nip);
+       return nip;
 }
 
 static int
@@ -769,8 +785,8 @@ ksocknal_select_ips(ksock_peer_ni_t *peer_ni, __u32 *peerips, int n_peerips)
 
        write_lock_bh(global_lock);
 
-        LASSERT (n_peerips <= LNET_MAX_INTERFACES);
-        LASSERT (net->ksnn_ninterfaces <= LNET_MAX_INTERFACES);
+       LASSERT(n_peerips <= LNET_NUM_INTERFACES);
+       LASSERT(net->ksnn_ninterfaces <= LNET_NUM_INTERFACES);
 
        /* Only match interfaces for additional connections
          * if I have > 1 interface */
@@ -854,7 +870,7 @@ ksocknal_create_routes(ksock_peer_ni_t *peer_ni, int port,
 {
        ksock_route_t           *newroute = NULL;
        rwlock_t                *global_lock = &ksocknal_data.ksnd_global_lock;
-       lnet_ni_t               *ni = peer_ni->ksnp_ni;
+       struct lnet_ni *ni = peer_ni->ksnp_ni;
        ksock_net_t             *net = ni->ni_data;
        struct list_head        *rtmp;
        ksock_route_t           *route;
@@ -880,7 +896,7 @@ ksocknal_create_routes(ksock_peer_ni_t *peer_ni, int port,
                 return;
         }
 
-        LASSERT (npeer_ipaddrs <= LNET_MAX_INTERFACES);
+       LASSERT(npeer_ipaddrs <= LNET_NUM_INTERFACES);
 
         for (i = 0; i < npeer_ipaddrs; i++) {
                 if (newroute != NULL) {
@@ -917,7 +933,7 @@ ksocknal_create_routes(ksock_peer_ni_t *peer_ni, int port,
                best_nroutes = 0;
                best_netmatch = 0;
 
-               LASSERT(net->ksnn_ninterfaces <= LNET_MAX_INTERFACES);
+               LASSERT(net->ksnn_ninterfaces <= LNET_NUM_INTERFACES);
 
                /* Select interface to connect from */
                for (j = 0; j < net->ksnn_ninterfaces; j++) {
@@ -967,7 +983,7 @@ ksocknal_create_routes(ksock_peer_ni_t *peer_ni, int port,
 }
 
 int
-ksocknal_accept(lnet_ni_t *ni, struct socket *sock)
+ksocknal_accept(struct lnet_ni *ni, struct socket *sock)
 {
        ksock_connreq_t *cr;
        int              rc;
@@ -1010,12 +1026,12 @@ ksocknal_connecting (ksock_peer_ni_t *peer_ni, __u32 ipaddr)
 }
 
 int
-ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
+ksocknal_create_conn(struct lnet_ni *ni, ksock_route_t *route,
                     struct socket *sock, int type)
 {
        rwlock_t                *global_lock = &ksocknal_data.ksnd_global_lock;
        struct list_head        zombies = LIST_HEAD_INIT(zombies);
-       lnet_process_id_t       peerid;
+       struct lnet_process_id peerid;
        struct list_head        *tmp;
         __u64              incarnation;
         ksock_conn_t      *conn;
@@ -1028,6 +1044,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
         ksock_tx_t        *tx;
         ksock_tx_t        *txtmp;
         int                rc;
+       int                rc2;
         int                active;
         char              *warn = NULL;
 
@@ -1061,7 +1078,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
        atomic_set (&conn->ksnc_tx_nob, 0);
 
        LIBCFS_ALLOC(hello, offsetof(struct ksock_hello_msg,
-                                    kshm_ips[LNET_MAX_INTERFACES]));
+                                    kshm_ips[LNET_NUM_INTERFACES]));
         if (hello == NULL) {
                 rc = -ENOMEM;
                 goto failed_1;
@@ -1256,6 +1273,15 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
        peer_ni->ksnp_error = 0;
 
        sched = ksocknal_choose_scheduler_locked(cpt);
+       if (!sched) {
+               CERROR("no schedulers available. node is unhealthy\n");
+               goto failed_2;
+       }
+       /*
+        * The cpt might have changed if we ended up selecting a non cpt
+        * native scheduler. So use the scheduler's cpt instead.
+        */
+       cpt = sched->kss_info->ksi_cpt;
         sched->kss_nconns++;
         conn->ksnc_scheduler = sched;
 
@@ -1310,7 +1336,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
         }
 
        LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
-                                    kshm_ips[LNET_MAX_INTERFACES]));
+                                   kshm_ips[LNET_NUM_INTERFACES]));
 
         /* setup the socket AFTER I've received hello (it disables
          * SO_LINGER).  I might call back to the acceptor who may want
@@ -1382,13 +1408,19 @@ failed_2:
                write_unlock_bh(global_lock);
         }
 
-        ksocknal_txlist_done(ni, &zombies, 1);
+       /*
+        * If we get here without an error code, just use -EALREADY.
+        * Depending on how we got here, the error may be positive
+        * or negative. Normalize the value for ksocknal_txlist_done().
+        */
+       rc2 = (rc == 0 ? -EALREADY : (rc > 0 ? -rc : rc));
+       ksocknal_txlist_done(ni, &zombies, rc2);
         ksocknal_peer_decref(peer_ni);
 
 failed_1:
        if (hello != NULL)
                LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
-                                           kshm_ips[LNET_MAX_INTERFACES]));
+                                           kshm_ips[LNET_NUM_INTERFACES]));
 
        LIBCFS_FREE(conn, sizeof(*conn));
 
@@ -1647,9 +1679,8 @@ ksocknal_destroy_conn (ksock_conn_t *conn)
                        conn->ksnc_rx_nob_wanted, conn->ksnc_rx_nob_left,
                       cfs_duration_sec(cfs_time_sub(ktime_get_real_seconds(),
                                         last_rcv)));
-                lnet_finalize (conn->ksnc_peer->ksnp_ni,
-                               conn->ksnc_cookie, -EIO);
-                break;
+               lnet_finalize(conn->ksnc_cookie, -EIO);
+               break;
         case SOCKNAL_RX_LNET_HEADER:
                 if (conn->ksnc_rx_started)
                        CERROR("Incomplete receive of lnet header from %s, "
@@ -1721,7 +1752,7 @@ ksocknal_close_conn_and_siblings (ksock_conn_t *conn, int why)
 }
 
 int
-ksocknal_close_matching_conns (lnet_process_id_t id, __u32 ipaddr)
+ksocknal_close_matching_conns(struct lnet_process_id id, __u32 ipaddr)
 {
         ksock_peer_ni_t       *peer_ni;
        struct list_head         *ptmp;
@@ -1763,14 +1794,15 @@ ksocknal_close_matching_conns (lnet_process_id_t id, __u32 ipaddr)
 }
 
 void
-ksocknal_notify (lnet_ni_t *ni, lnet_nid_t gw_nid, int alive)
+ksocknal_notify(struct lnet_ni *ni, lnet_nid_t gw_nid, int alive)
 {
-        /* The router is telling me she's been notified of a change in
-         * gateway state.... */
-        lnet_process_id_t  id = {0};
-
-        id.nid = gw_nid;
-        id.pid = LNET_PID_ANY;
+       /* The router is telling me she's been notified of a change in
+        * gateway state....
+        */
+       struct lnet_process_id id = {
+               .nid    = gw_nid,
+               .pid    = LNET_PID_ANY,
+       };
 
         CDEBUG (D_NET, "gw %s %s\n", libcfs_nid2str(gw_nid),
                 alive ? "up" : "down");
@@ -1786,14 +1818,14 @@ ksocknal_notify (lnet_ni_t *ni, lnet_nid_t gw_nid, int alive)
 }
 
 void
-ksocknal_query(lnet_ni_t *ni, lnet_nid_t nid, cfs_time_t *when)
+ksocknal_query(struct lnet_ni *ni, lnet_nid_t nid, cfs_time_t *when)
 {
        int connect = 1;
        time64_t last_alive = 0;
        time64_t now = ktime_get_real_seconds();
        ksock_peer_ni_t *peer_ni = NULL;
        rwlock_t *glock = &ksocknal_data.ksnd_global_lock;
-       lnet_process_id_t id = {
+       struct lnet_process_id id = {
                .nid = nid,
                .pid = LNET_PID_LUSTRE,
        };
@@ -1883,7 +1915,7 @@ ksocknal_push_peer (ksock_peer_ni_t *peer_ni)
 }
 
 static int
-ksocknal_push (lnet_ni_t *ni, lnet_process_id_t id)
+ksocknal_push(struct lnet_ni *ni, struct lnet_process_id id)
 {
        struct list_head *start;
        struct list_head *end;
@@ -1932,65 +1964,65 @@ ksocknal_push (lnet_ni_t *ni, lnet_process_id_t id)
 }
 
 static int
-ksocknal_add_interface(lnet_ni_t *ni, __u32 ipaddress, __u32 netmask)
+ksocknal_add_interface(struct lnet_ni *ni, __u32 ipaddress, __u32 netmask)
 {
-        ksock_net_t       *net = ni->ni_data;
-        ksock_interface_t *iface;
-        int                rc;
-        int                i;
-        int                j;
-       struct list_head        *ptmp;
-        ksock_peer_ni_t      *peer_ni;
-       struct list_head        *rtmp;
-        ksock_route_t     *route;
+       ksock_net_t *net = ni->ni_data;
+       ksock_interface_t *iface;
+       int rc;
+       int i;
+       int j;
+       struct list_head *ptmp;
+       ksock_peer_ni_t *peer_ni;
+       struct list_head *rtmp;
+       ksock_route_t *route;
 
-        if (ipaddress == 0 ||
-            netmask == 0)
-                return (-EINVAL);
+       if (ipaddress == 0 ||
+           netmask == 0)
+               return -EINVAL;
 
        write_lock_bh(&ksocknal_data.ksnd_global_lock);
 
-        iface = ksocknal_ip2iface(ni, ipaddress);
-        if (iface != NULL) {
-                /* silently ignore dups */
-                rc = 0;
-        } else if (net->ksnn_ninterfaces == LNET_MAX_INTERFACES) {
-                rc = -ENOSPC;
-        } else {
-                iface = &net->ksnn_interfaces[net->ksnn_ninterfaces++];
+       iface = ksocknal_ip2iface(ni, ipaddress);
+       if (iface != NULL) {
+               /* silently ignore dups */
+               rc = 0;
+       } else if (net->ksnn_ninterfaces == LNET_NUM_INTERFACES) {
+               rc = -ENOSPC;
+       } else {
+               iface = &net->ksnn_interfaces[net->ksnn_ninterfaces++];
 
-                iface->ksni_ipaddr = ipaddress;
-                iface->ksni_netmask = netmask;
-                iface->ksni_nroutes = 0;
-                iface->ksni_npeers = 0;
+               iface->ksni_ipaddr = ipaddress;
+               iface->ksni_netmask = netmask;
+               iface->ksni_nroutes = 0;
+               iface->ksni_npeers = 0;
 
-                for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
+               for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
                        list_for_each(ptmp, &ksocknal_data.ksnd_peers[i]) {
                                peer_ni = list_entry(ptmp, ksock_peer_ni_t,
-                                                      ksnp_list);
+                                                    ksnp_list);
 
-                                for (j = 0; j < peer_ni->ksnp_n_passive_ips; j++)
-                                        if (peer_ni->ksnp_passive_ips[j] == ipaddress)
-                                                iface->ksni_npeers++;
+                               for (j = 0; j < peer_ni->ksnp_n_passive_ips; j++)
+                                       if (peer_ni->ksnp_passive_ips[j] == ipaddress)
+                                               iface->ksni_npeers++;
 
                                list_for_each(rtmp, &peer_ni->ksnp_routes) {
                                        route = list_entry(rtmp,
-                                                               ksock_route_t,
-                                                               ksnr_list);
+                                                          ksock_route_t,
+                                                          ksnr_list);
 
-                                        if (route->ksnr_myipaddr == ipaddress)
-                                                iface->ksni_nroutes++;
-                                }
-                        }
-                }
+                                       if (route->ksnr_myipaddr == ipaddress)
+                                               iface->ksni_nroutes++;
+                               }
+                       }
+               }
 
-                rc = 0;
-                /* NB only new connections will pay attention to the new interface! */
-        }
+               rc = 0;
+               /* NB only new connections will pay attention to the new interface! */
+       }
 
        write_unlock_bh(&ksocknal_data.ksnd_global_lock);
 
-        return (rc);
+       return rc;
 }
 
 static void
@@ -2035,7 +2067,7 @@ ksocknal_peer_del_interface_locked(ksock_peer_ni_t *peer_ni, __u32 ipaddr)
 }
 
 static int
-ksocknal_del_interface(lnet_ni_t *ni, __u32 ipaddress)
+ksocknal_del_interface(struct lnet_ni *ni, __u32 ipaddress)
 {
         ksock_net_t       *net = ni->ni_data;
         int                rc = -ENOENT;
@@ -2083,9 +2115,9 @@ ksocknal_del_interface(lnet_ni_t *ni, __u32 ipaddress)
 }
 
 int
-ksocknal_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg)
+ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
 {
-       lnet_process_id_t id = {0};
+       struct lnet_process_id id = {0};
         struct libcfs_ioctl_data *data = arg;
         int rc;
 
@@ -2346,20 +2378,6 @@ ksocknal_base_shutdown(void)
        module_put(THIS_MODULE);
 }
 
-static __u64 ksocknal_new_incarnation(void)
-{
-       struct timeval tv;
-
-       /* The incarnation number is the time this module loaded and it
-        * identifies this particular instance of the socknal.  Hopefully
-        * we won't be able to reboot more frequently than 1MHz for the
-        * forseeable future :) */
-
-       do_gettimeofday(&tv);
-
-       return (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec;
-}
-
 static int
 ksocknal_base_startup(void)
 {
@@ -2426,20 +2444,23 @@ ksocknal_base_startup(void)
                info->ksi_nthreads_max = nthrs;
                info->ksi_cpt = i;
 
-               LIBCFS_CPT_ALLOC(info->ksi_scheds, lnet_cpt_table(), i,
-                                info->ksi_nthreads_max * sizeof(*sched));
-               if (info->ksi_scheds == NULL)
-                       goto failed;
-
-               for (; nthrs > 0; nthrs--) {
-                       sched = &info->ksi_scheds[nthrs - 1];
-
-                       sched->kss_info = info;
-                       spin_lock_init(&sched->kss_lock);
-                       INIT_LIST_HEAD(&sched->kss_rx_conns);
-                       INIT_LIST_HEAD(&sched->kss_tx_conns);
-                       INIT_LIST_HEAD(&sched->kss_zombie_noop_txs);
-                       init_waitqueue_head(&sched->kss_waitq);
+               if (nthrs != 0) {
+                       LIBCFS_CPT_ALLOC(info->ksi_scheds, lnet_cpt_table(), i,
+                                        info->ksi_nthreads_max *
+                                               sizeof(*sched));
+                       if (info->ksi_scheds == NULL)
+                               goto failed;
+
+                       for (; nthrs > 0; nthrs--) {
+                               sched = &info->ksi_scheds[nthrs - 1];
+
+                               sched->kss_info = info;
+                               spin_lock_init(&sched->kss_lock);
+                               INIT_LIST_HEAD(&sched->kss_rx_conns);
+                               INIT_LIST_HEAD(&sched->kss_tx_conns);
+                               INIT_LIST_HEAD(&sched->kss_zombie_noop_txs);
+                               init_waitqueue_head(&sched->kss_waitq);
+                       }
                }
         }
 
@@ -2493,7 +2514,7 @@ ksocknal_base_startup(void)
 }
 
 static void
-ksocknal_debug_peerhash (lnet_ni_t *ni)
+ksocknal_debug_peerhash(struct lnet_ni *ni)
 {
        ksock_peer_ni_t *peer_ni = NULL;
        struct list_head        *tmp;
@@ -2547,14 +2568,14 @@ ksocknal_debug_peerhash (lnet_ni_t *ni)
 }
 
 void
-ksocknal_shutdown (lnet_ni_t *ni)
+ksocknal_shutdown(struct lnet_ni *ni)
 {
-        ksock_net_t      *net = ni->ni_data;
-        int               i;
-        lnet_process_id_t anyid = {0};
-
-        anyid.nid =  LNET_NID_ANY;
-        anyid.pid =  LNET_PID_ANY;
+       ksock_net_t *net = ni->ni_data;
+       struct lnet_process_id anyid = {
+               .nid = LNET_NID_ANY,
+               .pid = LNET_PID_ANY,
+       };
+       int i;
 
         LASSERT(ksocknal_data.ksnd_init == SOCKNAL_INIT_ALL);
         LASSERT(ksocknal_data.ksnd_nnets > 0);
@@ -2634,11 +2655,11 @@ ksocknal_enumerate_interfaces(ksock_net_t *net)
                         continue;
                 }
 
-                if (j == LNET_MAX_INTERFACES) {
-                        CWARN("Ignoring interface %s (too many interfaces)\n",
-                              names[i]);
-                        continue;
-                }
+               if (j == LNET_NUM_INTERFACES) {
+                       CWARN("Ignoring interface %s (too many interfaces)\n",
+                             names[i]);
+                       continue;
+               }
 
                 net->ksnn_interfaces[j].ksni_ipaddr = ip;
                 net->ksnn_interfaces[j].ksni_netmask = mask;
@@ -2771,7 +2792,7 @@ ksocknal_net_start_threads(ksock_net_t *net, __u32 *cpts, int ncpts)
 }
 
 int
-ksocknal_startup (lnet_ni_t *ni)
+ksocknal_startup(struct lnet_ni *ni)
 {
        ksock_net_t  *net;
        int           rc;
@@ -2792,8 +2813,8 @@ ksocknal_startup (lnet_ni_t *ni)
                 goto fail_0;
 
        spin_lock_init(&net->ksnn_lock);
-        net->ksnn_incarnation = ksocknal_new_incarnation();
-        ni->ni_data = net;
+       net->ksnn_incarnation = ktime_get_real_ns();
+       ni->ni_data = net;
        if (!ni->ni_net->net_tunables_set) {
                ni->ni_net->net_tunables.lct_peer_timeout =
                        *ksocknal_tunables.ksnd_peertimeout;
@@ -2807,34 +2828,34 @@ ksocknal_startup (lnet_ni_t *ni)
        }
 
 
-        if (ni->ni_interfaces[0] == NULL) {
-                rc = ksocknal_enumerate_interfaces(net);
-                if (rc <= 0)
-                        goto fail_1;
+       if (ni->ni_interfaces[0] == NULL) {
+               rc = ksocknal_enumerate_interfaces(net);
+               if (rc <= 0)
+                       goto fail_1;
 
-                net->ksnn_ninterfaces = 1;
-        } else {
-                for (i = 0; i < LNET_MAX_INTERFACES; i++) {
-                        int    up;
+               net->ksnn_ninterfaces = 1;
+       } else {
+               for (i = 0; i < LNET_NUM_INTERFACES; i++) {
+                       int up;
 
-                        if (ni->ni_interfaces[i] == NULL)
-                                break;
+                       if (ni->ni_interfaces[i] == NULL)
+                               break;
 
                        rc = lnet_ipif_query(ni->ni_interfaces[i], &up,
-                                &net->ksnn_interfaces[i].ksni_ipaddr,
-                                &net->ksnn_interfaces[i].ksni_netmask);
+                               &net->ksnn_interfaces[i].ksni_ipaddr,
+                               &net->ksnn_interfaces[i].ksni_netmask);
 
-                        if (rc != 0) {
-                                CERROR("Can't get interface %s info: %d\n",
-                                       ni->ni_interfaces[i], rc);
-                                goto fail_1;
-                        }
+                       if (rc != 0) {
+                               CERROR("Can't get interface %s info: %d\n",
+                                      ni->ni_interfaces[i], rc);
+                               goto fail_1;
+                       }
 
-                        if (!up) {
-                                CERROR("Interface %s is down\n",
-                                       ni->ni_interfaces[i]);
-                                goto fail_1;
-                        }
+                       if (!up) {
+                               CERROR("Interface %s is down\n",
+                                      ni->ni_interfaces[i]);
+                               goto fail_1;
+                       }
 
                        strlcpy(net->ksnn_interfaces[i].ksni_name,
                                ni->ni_interfaces[i],
@@ -2848,10 +2869,10 @@ ksocknal_startup (lnet_ni_t *ni)
                                  net->ksnn_interfaces[0].ksni_name);
        if (net_dev != NULL) {
                node_id = dev_to_node(&net_dev->dev);
-               ni->dev_cpt = cfs_cpt_of_node(lnet_cpt_table(), node_id);
+               ni->ni_dev_cpt = cfs_cpt_of_node(lnet_cpt_table(), node_id);
                dev_put(net_dev);
        } else {
-               ni->dev_cpt = CFS_CPT_ANY;
+               ni->ni_dev_cpt = CFS_CPT_ANY;
        }
 
        /* call it before add it to ksocknal_data.ksnd_nets */