Whamcloud - gitweb
LU-13641 socklnd: remove tcp bonding
[fs/lustre-release.git] / lnet / lnet / api-ni.c
index 8528b83..322565a 100644 (file)
@@ -72,10 +72,10 @@ static int rnet_htable_size = LNET_REMOTE_NETS_HASH_DEFAULT;
 module_param(rnet_htable_size, int, 0444);
 MODULE_PARM_DESC(rnet_htable_size, "size of remote network hash table");
 
-static int use_tcp_bonding = false;
+static int use_tcp_bonding;
 module_param(use_tcp_bonding, int, 0444);
 MODULE_PARM_DESC(use_tcp_bonding,
-                "use_tcp_bonding parameter has been deprecated");
+                "use_tcp_bonding parameter has been removed");
 
 unsigned int lnet_numa_range = 0;
 module_param(lnet_numa_range, uint, 0444);
@@ -749,7 +749,8 @@ static void lnet_assert_wire_constants(void)
        /* Wire protocol assertions generated by 'wirecheck'
         * running on Linux robert.bartonsoftware.com 2.6.8-1.521
         * #1 Mon Aug 16 09:01:18 EDT 2004 i686 athlon i386 GNU/Linux
-        * with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7) */
+        * with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
+        */
 
        /* Constants... */
        BUILD_BUG_ON(LNET_PROTO_TCP_MAGIC != 0xeebc0ded);
@@ -761,6 +762,16 @@ static void lnet_assert_wire_constants(void)
        BUILD_BUG_ON(LNET_MSG_REPLY != 3);
        BUILD_BUG_ON(LNET_MSG_HELLO != 4);
 
+       BUILD_BUG_ON((int)sizeof(lnet_nid_t) != 8);
+       BUILD_BUG_ON((int)sizeof(lnet_pid_t) != 4);
+
+       /* Checks for struct lnet_process_id_packed */
+       BUILD_BUG_ON((int)sizeof(struct lnet_process_id_packed) != 12);
+       BUILD_BUG_ON((int)offsetof(struct lnet_process_id_packed, nid) != 0);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_process_id_packed *)0)->nid) != 8);
+       BUILD_BUG_ON((int)offsetof(struct lnet_process_id_packed, pid) != 8);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_process_id_packed *)0)->pid) != 4);
+
        /* Checks for struct lnet_handle_wire */
        BUILD_BUG_ON((int)sizeof(struct lnet_handle_wire) != 16);
        BUILD_BUG_ON((int)offsetof(struct lnet_handle_wire,
@@ -875,6 +886,43 @@ static void lnet_assert_wire_constants(void)
        BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_nnis) != 4);
        BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_ni) != 16);
        BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_ni) != 0);
+
+       /* Acceptor connection request */
+       BUILD_BUG_ON(LNET_PROTO_ACCEPTOR_VERSION != 1);
+
+       /* Checks for struct lnet_acceptor_connreq */
+       BUILD_BUG_ON((int)sizeof(struct lnet_acceptor_connreq) != 16);
+       BUILD_BUG_ON((int)offsetof(struct lnet_acceptor_connreq, acr_magic) != 0);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_acceptor_connreq *)0)->acr_magic) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_acceptor_connreq, acr_version) != 4);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_acceptor_connreq *)0)->acr_version) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_acceptor_connreq, acr_nid) != 8);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_acceptor_connreq *)0)->acr_nid) != 8);
+
+       /* Checks for struct lnet_counters_common */
+       BUILD_BUG_ON((int)sizeof(struct lnet_counters_common) != 60);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_msgs_alloc) != 0);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_msgs_alloc) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_msgs_max) != 4);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_msgs_max) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_errors) != 8);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_errors) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_send_count) != 12);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_send_count) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_recv_count) != 16);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_recv_count) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_route_count) != 20);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_route_count) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_drop_count) != 24);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_drop_count) != 4);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_send_length) != 28);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_send_length) != 8);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_recv_length) != 36);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_recv_length) != 8);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_route_length) != 44);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_route_length) != 8);
+       BUILD_BUG_ON((int)offsetof(struct lnet_counters_common, lcc_drop_length) != 52);
+       BUILD_BUG_ON((int)sizeof(((struct lnet_counters_common *)0)->lcc_drop_length) != 8);
 }
 
 static const struct lnet_lnd *lnet_find_lnd_by_type(__u32 type)
@@ -2509,19 +2557,6 @@ lnet_startup_lndnet(struct lnet_net *net, struct lnet_lnd_tunables *tun)
         * After than we want to delete the network being added,
         * to avoid a memory leak.
         */
-
-       /*
-        * When a network uses TCP bonding then all its interfaces
-        * must be specified when the network is first defined: the
-        * TCP bonding code doesn't allow for interfaces to be added
-        * or removed.
-        */
-       if (net_l != net && net_l != NULL && use_tcp_bonding &&
-           LNET_NETTYP(net_l->net_id) == SOCKLND) {
-               rc = -EINVAL;
-               goto failed0;
-       }
-
        while (!list_empty(&net->net_ni_added)) {
                ni = list_entry(net->net_ni_added.next, struct lnet_ni,
                                ni_netlist);
@@ -2530,7 +2565,7 @@ lnet_startup_lndnet(struct lnet_net *net, struct lnet_lnd_tunables *tun)
                /* make sure that the the NI we're about to start
                 * up is actually unique. if it's not fail. */
                if (!lnet_ni_unique_net(&net_l->net_ni_list,
-                                       ni->ni_interfaces[0])) {
+                                       ni->ni_interface)) {
                        rc = -EEXIST;
                        goto failed1;
                }
@@ -2774,7 +2809,7 @@ LNetNIInit(lnet_pid_t requested_pid)
        }
 
        if (use_tcp_bonding)
-               CWARN("'use_tcp_bonding' option has been deprecated. See LU-13641\n");
+               CWARN("use_tcp_bonding has been removed. Use Multi-Rail and Dynamic Discovery instead, see LU-13641\n");
 
        /* If LNet is being initialized via DLC it is possible
         * that the user requests not to load module parameters (ones which
@@ -2783,8 +2818,7 @@ LNetNIInit(lnet_pid_t requested_pid)
         * in this case.  On cleanup in case of failure only clean up
         * routes if it has been loaded */
        if (!the_lnet.ln_nis_from_mod_params) {
-               rc = lnet_parse_networks(&net_head, lnet_get_networks(),
-                                        use_tcp_bonding);
+               rc = lnet_parse_networks(&net_head, lnet_get_networks());
                if (rc < 0)
                        goto err_empty_list;
        }
@@ -2936,14 +2970,10 @@ lnet_fill_ni_info(struct lnet_ni *ni, struct lnet_ioctl_config_ni *cfg_ni,
        if (!ni || !cfg_ni || !tun)
                return;
 
-       if (ni->ni_interfaces[0] != NULL) {
-               for (i = 0; i < ARRAY_SIZE(ni->ni_interfaces); i++) {
-                       if (ni->ni_interfaces[i] != NULL) {
-                               strncpy(cfg_ni->lic_ni_intf[i],
-                                       ni->ni_interfaces[i],
-                                       sizeof(cfg_ni->lic_ni_intf[i]));
-                       }
-               }
+       if (ni->ni_interface != NULL) {
+               strncpy(cfg_ni->lic_ni_intf,
+                       ni->ni_interface,
+                       sizeof(cfg_ni->lic_ni_intf));
        }
 
        cfg_ni->lic_nid = ni->ni_nid;
@@ -2951,7 +2981,6 @@ lnet_fill_ni_info(struct lnet_ni *ni, struct lnet_ioctl_config_ni *cfg_ni,
                cfg_ni->lic_status = LNET_NI_STATUS_UP;
        else
                cfg_ni->lic_status = ni->ni_status->ns_status;
-       cfg_ni->lic_tcp_bonding = use_tcp_bonding;
        cfg_ni->lic_dev_cpt = ni->ni_dev_cpt;
 
        memcpy(&tun->lt_cmn, &ni->ni_net->net_tunables, sizeof(tun->lt_cmn));
@@ -3017,17 +3046,12 @@ lnet_fill_ni_info_legacy(struct lnet_ni *ni,
        if (!net_config)
                return;
 
-       BUILD_BUG_ON(ARRAY_SIZE(ni->ni_interfaces) !=
-                    ARRAY_SIZE(net_config->ni_interfaces));
-
-       for (i = 0; i < ARRAY_SIZE(ni->ni_interfaces); i++) {
-               if (!ni->ni_interfaces[i])
-                       break;
+       if (!ni->ni_interface)
+               return;
 
-               strncpy(net_config->ni_interfaces[i],
-                       ni->ni_interfaces[i],
-                       sizeof(net_config->ni_interfaces[i]));
-       }
+       strncpy(net_config->ni_interface,
+               ni->ni_interface,
+               sizeof(net_config->ni_interface));
 
        config->cfg_nid = ni->ni_nid;
        config->cfg_config_u.cfg_net.net_peer_timeout =
@@ -3370,7 +3394,7 @@ static int lnet_handle_legacy_ip2nets(char *ip2nets,
        if (rc < 0)
                return rc;
 
-       rc = lnet_parse_networks(&net_head, nets, use_tcp_bonding);
+       rc = lnet_parse_networks(&net_head, nets);
        if (rc < 0)
                return rc;
 
@@ -3433,7 +3457,7 @@ int lnet_dyn_add_ni(struct lnet_ioctl_config_ni *conf)
        }
 
        ni = lnet_ni_alloc_w_cpt_array(net, conf->lic_cpts, conf->lic_ncpts,
-                                      conf->lic_ni_intf[0]);
+                                      conf->lic_ni_intf);
        if (!ni)
                return -ENOMEM;
 
@@ -3552,7 +3576,7 @@ lnet_dyn_add_net(struct lnet_ioctl_config_data *conf)
        const char *nets = conf->cfg_config_u.cfg_net.net_intf;
 
        /* Create a net/ni structures for the network string */
-       rc = lnet_parse_networks(&net_head, nets, use_tcp_bonding);
+       rc = lnet_parse_networks(&net_head, nets);
        if (rc <= 0)
                return rc == 0 ? -EINVAL : rc;
 
@@ -4191,6 +4215,106 @@ LNetCtl(unsigned int cmd, void *arg)
                return 0;
        }
 
+       case IOC_LIBCFS_ADD_UDSP: {
+               struct lnet_ioctl_udsp *ioc_udsp = arg;
+               __u32 bulk_size = ioc_udsp->iou_hdr.ioc_len;
+
+               mutex_lock(&the_lnet.ln_api_mutex);
+               rc = lnet_udsp_demarshal_add(arg, bulk_size);
+               if (!rc) {
+                       rc = lnet_udsp_apply_policies(NULL, false);
+                       CDEBUG(D_NET, "policy application returned %d\n", rc);
+                       rc = 0;
+               }
+               mutex_unlock(&the_lnet.ln_api_mutex);
+
+               return rc;
+       }
+
+       case IOC_LIBCFS_DEL_UDSP: {
+               struct lnet_ioctl_udsp *ioc_udsp = arg;
+               int idx = ioc_udsp->iou_idx;
+
+               if (ioc_udsp->iou_hdr.ioc_len < sizeof(*ioc_udsp))
+                       return -EINVAL;
+
+               mutex_lock(&the_lnet.ln_api_mutex);
+               rc = lnet_udsp_del_policy(idx);
+               if (!rc) {
+                       rc = lnet_udsp_apply_policies(NULL, false);
+                       CDEBUG(D_NET, "policy re-application returned %d\n",
+                              rc);
+                       rc = 0;
+               }
+               mutex_unlock(&the_lnet.ln_api_mutex);
+
+               return rc;
+       }
+
+       case IOC_LIBCFS_GET_UDSP_SIZE: {
+               struct lnet_ioctl_udsp *ioc_udsp = arg;
+               struct lnet_udsp *udsp;
+
+               if (ioc_udsp->iou_hdr.ioc_len < sizeof(*ioc_udsp))
+                       return -EINVAL;
+
+               rc = 0;
+
+               mutex_lock(&the_lnet.ln_api_mutex);
+               udsp = lnet_udsp_get_policy(ioc_udsp->iou_idx);
+               if (!udsp) {
+                       rc = -ENOENT;
+               } else {
+                       /* coming in iou_idx will hold the idx of the udsp
+                        * to get the size of. going out the iou_idx will
+                        * hold the size of the UDSP found at the passed
+                        * in index.
+                        */
+                       ioc_udsp->iou_idx = lnet_get_udsp_size(udsp);
+                       if (ioc_udsp->iou_idx < 0)
+                               rc = -EINVAL;
+               }
+               mutex_unlock(&the_lnet.ln_api_mutex);
+
+               return rc;
+       }
+
+       case IOC_LIBCFS_GET_UDSP: {
+               struct lnet_ioctl_udsp *ioc_udsp = arg;
+               struct lnet_udsp *udsp;
+
+               if (ioc_udsp->iou_hdr.ioc_len < sizeof(*ioc_udsp))
+                       return -EINVAL;
+
+               rc = 0;
+
+               mutex_lock(&the_lnet.ln_api_mutex);
+               udsp = lnet_udsp_get_policy(ioc_udsp->iou_idx);
+               if (!udsp)
+                       rc = -ENOENT;
+               else
+                       rc = lnet_udsp_marshal(udsp, ioc_udsp);
+               mutex_unlock(&the_lnet.ln_api_mutex);
+
+               return rc;
+       }
+
+       case IOC_LIBCFS_GET_CONST_UDSP_INFO: {
+               struct lnet_ioctl_construct_udsp_info *info = arg;
+
+               if (info->cud_hdr.ioc_len < sizeof(*info))
+                       return -EINVAL;
+
+               CDEBUG(D_NET, "GET_UDSP_INFO for %s\n",
+                      libcfs_nid2str(info->cud_nid));
+
+               mutex_lock(&the_lnet.ln_api_mutex);
+               lnet_udsp_get_construct_info(info);
+               mutex_unlock(&the_lnet.ln_api_mutex);
+
+               return 0;
+       }
+
        default:
                ni = lnet_net2ni_addref(data->ioc_net);
                if (ni == NULL)
@@ -4489,6 +4613,18 @@ lnet_discover(struct lnet_process_id id, __u32 force,
        if (rc)
                goto out_decref;
 
+       /* The lpni (or lp) for this NID may have changed and our ref is
+        * the only thing keeping the old one around. Release the ref
+        * and lookup the lpni again
+        */
+       lnet_peer_ni_decref_locked(lpni);
+       lpni = lnet_find_peer_ni_locked(id.nid);
+       if (!lpni) {
+               rc = -ENOENT;
+               goto out;
+       }
+       lp = lpni->lpni_peer_net->lpn_peer;
+
        i = 0;
        p = NULL;
        while ((p = lnet_get_next_peer_ni_locked(lp, NULL, p)) != NULL) {