Whamcloud - gitweb
LU-2456 lnet: DLC user/kernel space glue code
[fs/lustre-release.git] / lnet / lnet / api-ni.c
index cf87d5e..5d4968e 100644 (file)
@@ -77,24 +77,24 @@ lnet_get_routes(void)
 char *
 lnet_get_networks(void)
 {
-        char   *nets;
-        int     rc;
+       char   *nets;
+       int     rc;
 
-        if (*networks != 0 && *ip2nets != 0) {
-                LCONSOLE_ERROR_MSG(0x101, "Please specify EITHER 'networks' or "
-                                   "'ip2nets' but not both at once\n");
-                return NULL;
-        }
+       if (*networks != 0 && *ip2nets != 0) {
+               LCONSOLE_ERROR_MSG(0x101, "Please specify EITHER 'networks' or "
+                                  "'ip2nets' but not both at once\n");
+               return NULL;
+       }
 
-        if (*ip2nets != 0) {
-                rc = lnet_parse_ip2nets(&nets, ip2nets);
-                return (rc == 0) ? nets : NULL;
-        }
+       if (*ip2nets != 0) {
+               rc = lnet_parse_ip2nets(&nets, ip2nets);
+               return (rc == 0) ? nets : NULL;
+       }
 
-        if (*networks != 0)
-                return networks;
+       if (*networks != 0)
+               return networks;
 
-        return "tcp";
+       return "tcp";
 }
 
 void
@@ -1780,7 +1780,9 @@ LNetNIInit(lnet_pid_t requested_pid)
        if (rc != 0)
                goto failed0;
 
-       rc = lnet_parse_networks(&net_head, lnet_get_networks());
+       rc = lnet_parse_networks(&net_head,
+                                !the_lnet.ln_nis_from_mod_params ?
+                                  lnet_get_networks() : "");
        if (rc < 0)
                goto failed1;
 
@@ -1895,6 +1897,93 @@ LNetNIFini()
 }
 EXPORT_SYMBOL(LNetNIFini);
 
+/**
+ * Grabs the ni data from the ni structure and fills the out
+ * parameters
+ *
+ * \param[in] ni network       interface structure
+ * \param[out] cpt_count       the number of cpts the ni is on
+ * \param[out] nid             Network Interface ID
+ * \param[out] peer_timeout    NI peer timeout
+ * \param[out] peer_tx_crdits  NI peer transmit credits
+ * \param[out] peer_rtr_credits NI peer router credits
+ * \param[out] max_tx_credits  NI max transmit credit
+ * \param[out] net_config      Network configuration
+ */
+static void
+lnet_fill_ni_info(struct lnet_ni *ni, __u32 *cpt_count, __u64 *nid,
+                 int *peer_timeout, int *peer_tx_credits,
+                 int *peer_rtr_credits, int *max_tx_credits,
+                 struct lnet_ioctl_net_config *net_config)
+{
+       int i;
+
+       if (ni == NULL)
+               return;
+
+       if (net_config == NULL)
+               return;
+
+       CLASSERT(ARRAY_SIZE(ni->ni_interfaces) ==
+                ARRAY_SIZE(net_config->ni_interfaces));
+
+       if (ni->ni_interfaces[0] != NULL) {
+               for (i = 0; i < ARRAY_SIZE(ni->ni_interfaces); i++) {
+                       if (ni->ni_interfaces[i] != NULL) {
+                               strncpy(net_config->ni_interfaces[i],
+                                       ni->ni_interfaces[i],
+                                       sizeof(net_config->ni_interfaces[i]));
+                       }
+               }
+       }
+
+       *nid = ni->ni_nid;
+       *peer_timeout = ni->ni_peertimeout;
+       *peer_tx_credits = ni->ni_peertxcredits;
+       *peer_rtr_credits = ni->ni_peerrtrcredits;
+       *max_tx_credits = ni->ni_maxtxcredits;
+
+       net_config->ni_status = ni->ni_status->ns_status;
+
+       for (i = 0;
+            ni->ni_cpts != NULL && i < ni->ni_ncpts &&
+            i < LNET_MAX_SHOW_NUM_CPT;
+            i++)
+               net_config->ni_cpts[i] = ni->ni_cpts[i];
+
+       *cpt_count = ni->ni_ncpts;
+}
+
+int
+lnet_get_net_config(int idx, __u32 *cpt_count, __u64 *nid, int *peer_timeout,
+                   int *peer_tx_credits, int *peer_rtr_credits,
+                   int *max_tx_credits,
+                   struct lnet_ioctl_net_config *net_config)
+{
+       struct lnet_ni          *ni;
+       struct list_head        *tmp;
+       int                     cpt;
+       int                     rc = -ENOENT;
+
+       cpt = lnet_net_lock_current();
+
+       list_for_each(tmp, &the_lnet.ln_nis) {
+               ni = list_entry(tmp, lnet_ni_t, ni_list);
+               if (idx-- == 0) {
+                       rc = 0;
+                       lnet_ni_lock(ni);
+                       lnet_fill_ni_info(ni, cpt_count, nid, peer_timeout,
+                                         peer_tx_credits, peer_rtr_credits,
+                                         max_tx_credits, net_config);
+                       lnet_ni_unlock(ni);
+                       break;
+               }
+       }
+
+       lnet_net_unlock(cpt);
+       return rc;
+}
+
 int
 lnet_dyn_add_ni(lnet_pid_t requested_pid, char *nets,
                __s32 peer_timeout, __s32 peer_cr, __s32 peer_buf_cr,
@@ -1994,9 +2083,13 @@ LNetCtl(unsigned int cmd, void *arg)
                return lnet_fail_nid(data->ioc_nid, data->ioc_count);
 
        case IOC_LIBCFS_ADD_ROUTE:
+               config = arg;
                LNET_MUTEX_LOCK(&the_lnet.ln_api_mutex);
-               rc = lnet_add_route(data->ioc_net, data->ioc_count,
-                                   data->ioc_nid, data->ioc_priority);
+               rc = lnet_add_route(config->cfg_net,
+                                   config->cfg_config_u.cfg_route.rtr_hop,
+                                   config->cfg_nid,
+                                   config->cfg_config_u.cfg_route.
+                                       rtr_priority);
                LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex);
                return (rc != 0) ? rc : lnet_check_routes();
 
@@ -2017,14 +2110,27 @@ LNetCtl(unsigned int cmd, void *arg)
                                      &config->cfg_config_u.cfg_route.
                                        rtr_priority);
 
-       case IOC_LIBCFS_ADD_NET:
-               return 0;
-
-       case IOC_LIBCFS_DEL_NET:
-               return 0;
-
-       case IOC_LIBCFS_GET_NET:
-               return 0;
+       case IOC_LIBCFS_GET_NET: {
+               struct lnet_ioctl_net_config *net_config;
+               config = arg;
+               net_config = (struct lnet_ioctl_net_config *)
+                       config->cfg_bulk;
+               if (config == NULL || net_config == NULL)
+                       return -1;
+
+               return lnet_get_net_config(config->cfg_count,
+                                          &config->cfg_ncpts,
+                                          &config->cfg_nid,
+                                          &config->cfg_config_u.
+                                               cfg_net.net_peer_timeout,
+                                          &config->cfg_config_u.cfg_net.
+                                               net_peer_tx_credits,
+                                          &config->cfg_config_u.cfg_net.
+                                               net_peer_rtr_credits,
+                                          &config->cfg_config_u.cfg_net.
+                                               net_max_tx_credits,
+                                          net_config);
+       }
 
        case IOC_LIBCFS_GET_LNET_STATS:
        {
@@ -2036,17 +2142,51 @@ LNetCtl(unsigned int cmd, void *arg)
 
 #if defined(__KERNEL__) && defined(LNET_ROUTER)
        case IOC_LIBCFS_CONFIG_RTR:
+               config = arg;
+               LNET_MUTEX_LOCK(&the_lnet.ln_api_mutex);
+               if (config->cfg_config_u.cfg_buffers.buf_enable) {
+                       rc = lnet_rtrpools_enable();
+                       LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex);
+                       return rc;
+               }
+               lnet_rtrpools_disable();
+               LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex);
                return 0;
 
        case IOC_LIBCFS_ADD_BUF:
-               return 0;
+               config = arg;
+               LNET_MUTEX_LOCK(&the_lnet.ln_api_mutex);
+               rc = lnet_rtrpools_adjust(config->cfg_config_u.cfg_buffers.
+                                               buf_tiny,
+                                         config->cfg_config_u.cfg_buffers.
+                                               buf_small,
+                                         config->cfg_config_u.cfg_buffers.
+                                               buf_large);
+               LNET_MUTEX_UNLOCK(&the_lnet.ln_api_mutex);
+               return rc;
 #endif
 
-       case IOC_LIBCFS_GET_BUF:
-               return 0;
+       case IOC_LIBCFS_GET_BUF: {
+               struct lnet_ioctl_pool_cfg *pool_cfg;
+               config = arg;
+               pool_cfg = (struct lnet_ioctl_pool_cfg *)config->cfg_bulk;
+               return lnet_get_rtr_pool_cfg(config->cfg_count, pool_cfg);
+       }
 
-       case IOC_LIBCFS_GET_PEER_INFO:
-               return 0;
+       case IOC_LIBCFS_GET_PEER_INFO: {
+               struct lnet_ioctl_peer *peer_info = arg;
+               return lnet_get_peer_info(
+                  peer_info->pr_count,
+                  &peer_info->pr_nid,
+                  peer_info->pr_lnd_u.pr_peer_credits.cr_aliveness,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_ncpt,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_refcount,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_ni_peer_tx_credits,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_peer_tx_credits,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_peer_rtr_credits,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_peer_min_rtr_credits,
+                  &peer_info->pr_lnd_u.pr_peer_credits.cr_peer_tx_qnob);
+       }
 
        case IOC_LIBCFS_NOTIFY_ROUTER:
                return lnet_notify(NULL, data->ioc_nid, data->ioc_flags,