Whamcloud - gitweb
LU-6142 socklnd: change UAPI typedefs to proper structure
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd.c
index 02601e6..f3a5dfd 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -100,24 +96,23 @@ ksocknal_destroy_route (ksock_route_t *route)
 }
 
 static int
-ksocknal_create_peer (ksock_peer_t **peerp, lnet_ni_t *ni, lnet_process_id_t id)
+ksocknal_create_peer(ksock_peer_t **peerp, lnet_ni_t *ni, lnet_process_id_t id)
 {
-       ksock_net_t   *net = ni->ni_data;
-       ksock_peer_t  *peer;
+       int             cpt = lnet_cpt_of_nid(id.nid);
+       ksock_net_t     *net = ni->ni_data;
+       ksock_peer_t    *peer;
 
-       LASSERT (id.nid != LNET_NID_ANY);
-       LASSERT (id.pid != LNET_PID_ANY);
-       LASSERT (!in_interrupt());
+       LASSERT(id.nid != LNET_NID_ANY);
+       LASSERT(id.pid != LNET_PID_ANY);
+       LASSERT(!in_interrupt());
 
-       LIBCFS_ALLOC (peer, sizeof (*peer));
+       LIBCFS_CPT_ALLOC(peer, lnet_cpt_table(), cpt, sizeof(*peer));
        if (peer == NULL)
                return -ENOMEM;
 
-       memset (peer, 0, sizeof (*peer));       /* NULL pointers/clear flags etc */
-
        peer->ksnp_ni = ni;
        peer->ksnp_id = id;
-       atomic_set (&peer->ksnp_refcount, 1);   /* 1 ref for caller */
+       atomic_set(&peer->ksnp_refcount, 1);    /* 1 ref for caller */
        peer->ksnp_closing = 0;
        peer->ksnp_accepting = 0;
        peer->ksnp_proto = NULL;
@@ -1027,7 +1022,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
         ksock_peer_t      *peer = NULL;
         ksock_peer_t      *peer2;
         ksock_sched_t     *sched;
-        ksock_hello_msg_t *hello;
+       struct ksock_hello_msg *hello;
        int                cpt;
         ksock_tx_t        *tx;
         ksock_tx_t        *txtmp;
@@ -1045,8 +1040,6 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
                 goto failed_0;
         }
 
-        memset (conn, 0, sizeof (*conn));
-
         conn->ksnc_peer = NULL;
         conn->ksnc_route = NULL;
         conn->ksnc_sock = sock;
@@ -1066,7 +1059,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
        conn->ksnc_tx_carrier = NULL;
        atomic_set (&conn->ksnc_tx_nob, 0);
 
-       LIBCFS_ALLOC(hello, offsetof(ksock_hello_msg_t,
+       LIBCFS_ALLOC(hello, offsetof(struct ksock_hello_msg,
                                     kshm_ips[LNET_MAX_INTERFACES]));
         if (hello == NULL) {
                 rc = -ENOMEM;
@@ -1315,7 +1308,7 @@ ksocknal_create_conn(lnet_ni_t *ni, ksock_route_t *route,
                 rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
         }
 
-        LIBCFS_FREE(hello, offsetof(ksock_hello_msg_t,
+       LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
                                     kshm_ips[LNET_MAX_INTERFACES]));
 
         /* setup the socket AFTER I've received hello (it disables
@@ -1391,10 +1384,10 @@ failed_2:
         ksocknal_txlist_done(ni, &zombies, 1);
         ksocknal_peer_decref(peer);
 
- failed_1:
-        if (hello != NULL)
-                LIBCFS_FREE(hello, offsetof(ksock_hello_msg_t,
-                                            kshm_ips[LNET_MAX_INTERFACES]));
+failed_1:
+       if (hello != NULL)
+               LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
+                                           kshm_ips[LNET_MAX_INTERFACES]));
 
        LIBCFS_FREE(conn, sizeof(*conn));
 
@@ -1442,11 +1435,6 @@ ksocknal_close_conn_locked (ksock_conn_t *conn, int error)
 
                conn->ksnc_route = NULL;
 
-#if 0          /* irrelevent with only eager routes */
-               /* make route least favourite */
-               list_del(&route->ksnr_list);
-               list_add_tail(&route->ksnr_list, &peer->ksnp_routes);
-#endif
                ksocknal_route_decref(route);   /* drop conn's ref on route */
        }
 
@@ -1497,9 +1485,9 @@ ksocknal_peer_failed (ksock_peer_t *peer)
         int        notify = 0;
         cfs_time_t last_alive = 0;
 
-        /* There has been a connection failure or comms error; but I'll only
-         * tell LNET I think the peer is dead if it's to another kernel and
-         * there are no connections or connection attempts in existance. */
+       /* There has been a connection failure or comms error; but I'll only
+        * tell LNET I think the peer is dead if it's to another kernel and
+        * there are no connections or connection attempts in existence. */
 
        read_lock(&ksocknal_data.ksnd_global_lock);
 
@@ -1896,50 +1884,50 @@ ksocknal_push_peer (ksock_peer_t *peer)
 static int
 ksocknal_push (lnet_ni_t *ni, lnet_process_id_t id)
 {
-        ksock_peer_t      *peer;
-       struct list_head        *tmp;
-        int                index;
-        int                i;
-        int                j;
-        int                rc = -ENOENT;
-
-        for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
-                for (j = 0; ; j++) {
-                       read_lock(&ksocknal_data.ksnd_global_lock);
+       struct list_head *start;
+       struct list_head *end;
+       struct list_head *tmp;
+       int               rc = -ENOENT;
+       unsigned int      hsize = ksocknal_data.ksnd_peer_hash_size;
 
-                        index = 0;
-                        peer = NULL;
+       if (id.nid == LNET_NID_ANY) {
+               start = &ksocknal_data.ksnd_peers[0];
+               end = &ksocknal_data.ksnd_peers[hsize - 1];
+       } else {
+               start = end = ksocknal_nid2peerlist(id.nid);
+       }
 
-                       list_for_each(tmp, &ksocknal_data.ksnd_peers[i]) {
-                               peer = list_entry(tmp, ksock_peer_t,
-                                                      ksnp_list);
+       for (tmp = start; tmp <= end; tmp++) {
+               int     peer_off; /* searching offset in peer hash table */
 
-                                if (!((id.nid == LNET_NID_ANY ||
-                                       id.nid == peer->ksnp_id.nid) &&
-                                      (id.pid == LNET_PID_ANY ||
-                                       id.pid == peer->ksnp_id.pid))) {
-                                        peer = NULL;
-                                        continue;
-                                }
+               for (peer_off = 0; ; peer_off++) {
+                       ksock_peer_t *peer;
+                       int           i = 0;
 
-                                if (index++ == j) {
-                                        ksocknal_peer_addref(peer);
-                                        break;
-                                }
-                        }
+                       read_lock(&ksocknal_data.ksnd_global_lock);
+                       list_for_each_entry(peer, tmp, ksnp_list) {
+                               if (!((id.nid == LNET_NID_ANY ||
+                                      id.nid == peer->ksnp_id.nid) &&
+                                     (id.pid == LNET_PID_ANY ||
+                                      id.pid == peer->ksnp_id.pid)))
+                                       continue;
 
+                               if (i++ == peer_off) {
+                                       ksocknal_peer_addref(peer);
+                                       break;
+                               }
+                       }
                        read_unlock(&ksocknal_data.ksnd_global_lock);
 
-                        if (peer != NULL) {
-                                rc = 0;
-                                ksocknal_push_peer (peer);
-                                ksocknal_peer_decref(peer);
-                        }
-                }
-
-        }
+                       if (i == 0) /* no match */
+                               break;
 
-        return (rc);
+                       rc = 0;
+                       ksocknal_push_peer(peer);
+                       ksocknal_peer_decref(peer);
+               }
+       }
+       return rc;
 }
 
 static int
@@ -2330,17 +2318,19 @@ ksocknal_base_shutdown(void)
                        }
                }
 
-                i = 4;
+               i = 4;
                read_lock(&ksocknal_data.ksnd_global_lock);
-                while (ksocknal_data.ksnd_nthreads != 0) {
-                        i++;
-                        CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */
-                               "waiting for %d threads to terminate\n",
-                                ksocknal_data.ksnd_nthreads);
+               while (ksocknal_data.ksnd_nthreads != 0) {
+                       i++;
+                       /* power of 2? */
+                       CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET,
+                               "waiting for %d threads to terminate\n",
+                               ksocknal_data.ksnd_nthreads);
                        read_unlock(&ksocknal_data.ksnd_global_lock);
-                        cfs_pause(cfs_time_seconds(1));
+                       set_current_state(TASK_UNINTERRUPTIBLE);
+                       schedule_timeout(cfs_time_seconds(1));
                        read_lock(&ksocknal_data.ksnd_global_lock);
-                }
+               }
                read_unlock(&ksocknal_data.ksnd_global_lock);
 
                 ksocknal_free_buffers();
@@ -2475,7 +2465,7 @@ ksocknal_base_startup(void)
 
                snprintf(name, sizeof(name), "socknal_cd%02d", i);
                rc = ksocknal_thread_start(ksocknal_connd,
-                                          (void *)((ulong_ptr_t)i), name);
+                                          (void *)((uintptr_t)i), name);
                if (rc != 0) {
                        spin_lock_bh(&ksocknal_data.ksnd_connd_lock);
                        ksocknal_data.ksnd_connd_starting--;
@@ -2525,7 +2515,7 @@ ksocknal_debug_peerhash (lnet_ni_t *ni)
                 ksock_conn_t  *conn;
 
                CWARN ("Active peer on shutdown: %s, ref %d, scnt %d, "
-                      "closing %d, accepting %d, err %d, zcookie "LPU64", "
+                      "closing %d, accepting %d, err %d, zcookie %llu, "
                       "txq %d, zc_req %d\n", libcfs_id2str(peer->ksnp_id),
                       atomic_read(&peer->ksnp_refcount),
                       peer->ksnp_sharecount, peer->ksnp_closing,
@@ -2585,7 +2575,8 @@ ksocknal_shutdown (lnet_ni_t *ni)
                CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */
                       "waiting for %d peers to disconnect\n",
                       net->ksnn_npeers);
-               cfs_pause(cfs_time_seconds(1));
+               set_current_state(TASK_UNINTERRUPTIBLE);
+               schedule_timeout(cfs_time_seconds(1));
 
                ksocknal_debug_peerhash(ni);
 
@@ -2863,44 +2854,43 @@ ksocknal_startup (lnet_ni_t *ni)
 }
 
 
-static void __exit
-ksocknal_module_fini (void)
+static void __exit ksocklnd_exit(void)
 {
-        lnet_unregister_lnd(&the_ksocklnd);
-        ksocknal_tunables_fini();
+       lnet_unregister_lnd(&the_ksocklnd);
 }
 
-static int __init
-ksocknal_module_init (void)
+static int __init ksocklnd_init(void)
 {
-        int    rc;
-
-        /* check ksnr_connected/connecting field large enough */
-        CLASSERT (SOCKLND_CONN_NTYPES <= 4);
-        CLASSERT (SOCKLND_CONN_ACK == SOCKLND_CONN_BULK_IN);
-
-        /* initialize the_ksocklnd */
-        the_ksocklnd.lnd_type     = SOCKLND;
-        the_ksocklnd.lnd_startup  = ksocknal_startup;
-        the_ksocklnd.lnd_shutdown = ksocknal_shutdown;
-        the_ksocklnd.lnd_ctl      = ksocknal_ctl;
-        the_ksocklnd.lnd_send     = ksocknal_send;
-        the_ksocklnd.lnd_recv     = ksocknal_recv;
-        the_ksocklnd.lnd_notify   = ksocknal_notify;
-        the_ksocklnd.lnd_query    = ksocknal_query;
-        the_ksocklnd.lnd_accept   = ksocknal_accept;
-
-        rc = ksocknal_tunables_init();
-        if (rc != 0)
-                return rc;
+       int rc;
+
+       /* check ksnr_connected/connecting field large enough */
+       CLASSERT(SOCKLND_CONN_NTYPES <= 4);
+       CLASSERT(SOCKLND_CONN_ACK == SOCKLND_CONN_BULK_IN);
+
+       /* initialize the_ksocklnd */
+       the_ksocklnd.lnd_type     = SOCKLND;
+       the_ksocklnd.lnd_startup  = ksocknal_startup;
+       the_ksocklnd.lnd_shutdown = ksocknal_shutdown;
+       the_ksocklnd.lnd_ctl      = ksocknal_ctl;
+       the_ksocklnd.lnd_send     = ksocknal_send;
+       the_ksocklnd.lnd_recv     = ksocknal_recv;
+       the_ksocklnd.lnd_notify   = ksocknal_notify;
+       the_ksocklnd.lnd_query    = ksocknal_query;
+       the_ksocklnd.lnd_accept   = ksocknal_accept;
+
+       rc = ksocknal_tunables_init();
+       if (rc != 0)
+               return rc;
 
-        lnet_register_lnd(&the_ksocklnd);
+       lnet_register_lnd(&the_ksocklnd);
 
-        return 0;
+       return 0;
 }
 
-MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
-MODULE_DESCRIPTION("Kernel TCP Socket LND v3.0.0");
+MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
+MODULE_DESCRIPTION("TCP Socket LNet Network Driver");
+MODULE_VERSION("2.8.0");
 MODULE_LICENSE("GPL");
 
-cfs_module(ksocknal, "3.0.0", ksocknal_module_init, ksocknal_module_fini);
+module_init(ksocklnd_init);
+module_exit(ksocklnd_exit);