Whamcloud - gitweb
LU-13569 lnet: Add health ping stats
[fs/lustre-release.git] / lnet / utils / lnetconfig / liblnetconfig.c
index 3f24797..dd59a33 100644 (file)
 #include <glob.h>
 #include <libcfs/util/param.h>
 
-#define CONFIG_CMD             "configure"
-#define UNCONFIG_CMD           "unconfigure"
-#define ADD_CMD                        "add"
-#define DEL_CMD                        "del"
-#define SHOW_CMD               "show"
-#define DBG_CMD                        "dbg"
-#define MANAGE_CMD             "manage"
-
-#define MAX_NUM_IPS            128
-
-#define modparam_path "/sys/module/lnet/parameters/"
-#define o2ib_modparam_path "/sys/module/ko2iblnd/parameters/"
-#define gni_nid_path "/proc/cray_xt/"
-
 #ifndef HAVE_USRSPC_RDMA_PS_TCP
 #define RDMA_PS_TCP 0x0106
 #endif
@@ -801,7 +787,7 @@ int lustre_lnet_route_common(char *nw, char *nidstr, int hops, int prio,
        }
 
        rnet = libcfs_str2net(nw);
-       if (rnet == LNET_NIDNET(LNET_NID_ANY)) {
+       if (rnet == LNET_NET_ANY) {
                snprintf(err_str, LNET_MAX_STR_LEN,
                         "\"cannot parse remote net %s\"", nw);
                rc = LUSTRE_CFG_RC_BAD_PARAM;
@@ -918,7 +904,7 @@ int lustre_lnet_show_route(char *nw, char *gw, int hops, int prio, int detail,
        lnet_nid_t gateway_nid;
        int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
        int l_errno = 0;
-       __u32 net = LNET_NIDNET(LNET_NID_ANY);
+       __u32 net = LNET_NET_ANY;
        int i;
        struct cYAML *root = NULL, *route = NULL, *item = NULL;
        struct cYAML *first_seq = NULL;
@@ -927,7 +913,7 @@ int lustre_lnet_show_route(char *nw, char *gw, int hops, int prio, int detail,
 
        if (nw != NULL) {
                net = libcfs_str2net(nw);
-               if (net == LNET_NIDNET(LNET_NID_ANY)) {
+               if (net == LNET_NET_ANY) {
                        snprintf(err_str,
                                 sizeof(err_str),
                                 "\"cannot parse net '%s'\"", nw);
@@ -937,7 +923,7 @@ int lustre_lnet_show_route(char *nw, char *gw, int hops, int prio, int detail,
 
        } else {
                /* show all routes without filtering on net */
-               net = LNET_NIDNET(LNET_NID_ANY);
+               net = LNET_NET_ANY;
        }
 
        if (gw != NULL) {
@@ -985,7 +971,7 @@ int lustre_lnet_show_route(char *nw, char *gw, int hops, int prio, int detail,
                }
 
                /* filter on provided data */
-               if (net != LNET_NIDNET(LNET_NID_ANY) &&
+               if (net != LNET_NET_ANY &&
                    net != data.cfg_net)
                        continue;
 
@@ -1472,7 +1458,7 @@ lustre_lnet_ioctl_config_ni(struct list_head *intf_list,
                LIBCFS_IOC_INIT_V2(*conf, lic_cfg_hdr);
                conf->lic_cfg_hdr.ioc_len = len;
                conf->lic_nid = nids[i];
-               strncpy(conf->lic_ni_intf[0], intf_descr->intf_name,
+               strncpy(conf->lic_ni_intf, intf_descr->intf_name,
                        LNET_MAX_STR_LEN);
 
                if (intf_descr->cpt_expr != NULL)
@@ -1663,7 +1649,7 @@ int lustre_lnet_config_ni(struct lnet_dlc_network_descr *nw_descr,
                goto out;
        }
 
-       if (nw_descr->nw_id == LNET_NIDNET(LNET_NID_ANY)) {
+       if (nw_descr->nw_id == LNET_NET_ANY) {
                snprintf(err_str,
                        sizeof(err_str),
                        "\"cannot parse net '%s'\"",
@@ -1739,7 +1725,7 @@ int lustre_lnet_del_ni(struct lnet_dlc_network_descr *nw_descr,
        if (LNET_NETTYP(nw_descr->nw_id) == LOLND)
                return LUSTRE_CFG_RC_NO_ERR;
 
-       if (nw_descr->nw_id == LNET_NIDNET(LNET_NID_ANY)) {
+       if (nw_descr->nw_id == LNET_NET_ANY) {
                snprintf(err_str,
                         sizeof(err_str),
                         "\"cannot parse net '%s'\"",
@@ -1893,6 +1879,114 @@ get_counts(struct lnet_ioctl_element_msg_stats *msg_stats, int idx)
        return NULL;
 }
 
+static int
+create_local_udsp_info(struct lnet_ioctl_construct_udsp_info *udsp_info,
+                      struct cYAML *net_node)
+{
+       char tmp[LNET_MAX_STR_LEN];
+       struct cYAML *udsp_net;
+       bool created = false;
+       struct cYAML *pref;
+       int i;
+
+       /* add the UDSP info */
+       udsp_net = cYAML_create_object(net_node, "udsp info");
+       if (!udsp_net)
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_net, "net priority",
+                                (int) udsp_info->cud_net_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_net, "nid priority",
+                                (int)udsp_info->cud_nid_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       pref = udsp_net;
+
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_rtr_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_net,
+                                       "Preferred gateway NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_rtr_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       return LUSTRE_CFG_RC_NO_ERR;
+}
+
+static int
+create_remote_udsp_info(struct lnet_ioctl_construct_udsp_info *udsp_info,
+                       struct cYAML *nid_node)
+{
+       char tmp[LNET_MAX_STR_LEN];
+       struct cYAML *udsp_nid;
+       bool created = false;
+       struct cYAML *pref;
+       int i;
+
+       /* add the UDSP info */
+       udsp_nid = cYAML_create_object(nid_node, "udsp info");
+       if (!udsp_nid)
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_nid, "net priority",
+                                (int) udsp_info->cud_net_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       if (!cYAML_create_number(udsp_nid, "nid priority",
+                                (int) udsp_info->cud_nid_priority))
+               return LUSTRE_CFG_RC_OUT_OF_MEM;
+
+       pref = udsp_nid;
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_rtr_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_nid,
+                                       "Preferred gateway NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_rtr_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       pref = udsp_nid;
+       created = false;
+       for (i = 0; i < LNET_MAX_SHOW_NUM_NID; i++) {
+               memset(tmp, 0, LNET_MAX_STR_LEN);
+               if (udsp_info->cud_pref_nid[i] == 0)
+                       break;
+               if (!created) {
+                       pref = cYAML_create_object(udsp_nid,
+                                       "Preferred source NIDs");
+                       if (!pref)
+                               return LUSTRE_CFG_RC_OUT_OF_MEM;
+                       created = true;
+               }
+               snprintf(tmp, sizeof(tmp), "NID-%d", i);
+               if (!cYAML_create_string(pref, tmp,
+                       libcfs_nid2str(udsp_info->cud_pref_nid[i])))
+                       return LUSTRE_CFG_RC_OUT_OF_MEM;
+       }
+
+       return LUSTRE_CFG_RC_NO_ERR;
+}
+
 int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                         struct cYAML **show_rc, struct cYAML **err_rc,
                         bool backup)
@@ -1903,8 +1997,9 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
        struct lnet_ioctl_element_stats *stats;
        struct lnet_ioctl_element_msg_stats msg_stats;
        struct lnet_ioctl_local_ni_hstats hstats;
-       __u32 net = LNET_NIDNET(LNET_NID_ANY);
-       __u32 prev_net = LNET_NIDNET(LNET_NID_ANY);
+       struct lnet_ioctl_construct_udsp_info udsp_info;
+       __u32 net = LNET_NET_ANY;
+       __u32 prev_net = LNET_NET_ANY;
        int rc = LUSTRE_CFG_RC_OUT_OF_MEM, i, j;
        int l_errno = 0;
        struct cYAML *root = NULL, *tunables = NULL,
@@ -1928,7 +2023,7 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
 
        if (nw != NULL) {
                net = libcfs_str2net(nw);
-               if (net == LNET_NIDNET(LNET_NID_ANY)) {
+               if (net == LNET_NET_ANY) {
                        snprintf(err_str,
                                 sizeof(err_str),
                                 "\"cannot parse net '%s'\"", nw);
@@ -1967,7 +2062,7 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                rc_net = LNET_NIDNET(ni_data->lic_nid);
 
                /* filter on provided data */
-               if (net != LNET_NIDNET(LNET_NID_ANY) &&
+               if (net != LNET_NET_ANY &&
                    net != rc_net)
                        continue;
 
@@ -2023,22 +2118,15 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
 
                /* don't add interfaces unless there is at least one
                 * interface */
-               if (strlen(ni_data->lic_ni_intf[0]) > 0) {
+               if (strlen(ni_data->lic_ni_intf) > 0) {
                        interfaces = cYAML_create_object(item, "interfaces");
                        if (interfaces == NULL)
                                goto out;
 
-                       for (j = 0; j < LNET_INTERFACES_NUM; j++) {
-                               if (strlen(ni_data->lic_ni_intf[j]) > 0) {
-                                       snprintf(str_buf,
-                                                sizeof(str_buf), "%d", j);
-                                       if (cYAML_create_string(interfaces,
-                                               str_buf,
-                                               ni_data->lic_ni_intf[j]) ==
-                                                       NULL)
-                                               goto out;
-                               }
-                       }
+                       snprintf(str_buf, sizeof(str_buf), "%d", 0);
+                       if (cYAML_create_string(interfaces, str_buf,
+                                               ni_data->lic_ni_intf) == NULL)
+                               goto out;
                }
 
                if (detail) {
@@ -2067,6 +2155,27 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                                                        == NULL)
                                goto out;
 
+                       if (detail < 4)
+                               goto continue_without_udsp_info;
+
+                       LIBCFS_IOC_INIT_V2(udsp_info, cud_hdr);
+                       udsp_info.cud_nid = ni_data->lic_nid;
+                       udsp_info.cud_peer = false;
+                       rc = l_ioctl(LNET_DEV_ID,
+                                    IOC_LIBCFS_GET_CONST_UDSP_INFO,
+                                    &udsp_info);
+                       if (rc != 0) {
+                               l_errno = errno;
+                               goto continue_without_udsp_info;
+                       }
+
+                       rc = create_local_udsp_info(&udsp_info, item);
+                       if (rc) {
+                               l_errno = errno;
+                               goto out;
+                       }
+
+continue_without_udsp_info:
                        if (detail < 2)
                                goto continue_without_msg_stats;
 
@@ -2141,6 +2250,14 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no,
                                                hstats.hlni_local_error)
                                                        == NULL)
                                goto out;
+                       if (cYAML_create_number(yhstats, "ping_count",
+                                               hstats.hlni_ping_count)
+                                                       == NULL)
+                               goto out;
+                       if (cYAML_create_number(yhstats, "next_ping",
+                                               hstats.hlni_next_ping)
+                                                       == NULL)
+                               goto out;
 
 continue_without_msg_stats:
                        tunables = cYAML_create_object(item, "tunables");
@@ -2169,12 +2286,6 @@ continue_without_msg_stats:
                                                ni_data->lic_dev_cpt) == NULL)
                                goto out;
 
-                       if (!backup &&
-                           cYAML_create_number(item, "tcp bonding",
-                                               ni_data->lic_tcp_bonding)
-                                                       == NULL)
-                               goto out;
-
                        /* out put the CPTs in the format: "[x,x,x,...]" */
                        pos = str_buf;
                        limit = str_buf + str_buf_len - 3;
@@ -2421,6 +2532,36 @@ int lustre_lnet_config_response_tracking(int val, int seq_no,
        return rc;
 }
 
+int lustre_lnet_config_recovery_limit(int val, int seq_no,
+                                     struct cYAML **err_rc)
+{
+       int rc = LUSTRE_CFG_RC_NO_ERR;
+       char err_str[LNET_MAX_STR_LEN];
+       char val_str[LNET_MAX_STR_LEN];
+
+       if (val < 0) {
+               rc = LUSTRE_CFG_RC_BAD_PARAM;
+               snprintf(err_str, sizeof(err_str),
+                        "\"Must be greater than or equal to 0\"");
+       } else {
+               snprintf(err_str, sizeof(err_str), "\"success\"");
+
+               snprintf(val_str, sizeof(val_str), "%d", val);
+
+               rc = write_sysfs_file(modparam_path, "lnet_recovery_limit",
+                                     val_str, 1, strlen(val_str) + 1);
+               if (rc)
+                       snprintf(err_str, sizeof(err_str),
+                                "\"cannot configure recovery limit: %s\"",
+                                strerror(errno));
+       }
+
+       cYAML_build_error(rc, seq_no, ADD_CMD, "recovery_limit", err_str,
+                         err_rc);
+
+       return rc;
+}
+
 int lustre_lnet_config_max_intf(int max, int seq_no, struct cYAML **err_rc)
 {
        int rc = LUSTRE_CFG_RC_NO_ERR;
@@ -2714,6 +2855,7 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
        struct lnet_ioctl_element_stats *lpni_stats;
        struct lnet_ioctl_element_msg_stats *msg_stats;
        struct lnet_ioctl_peer_ni_hstats *hstats;
+       struct lnet_ioctl_construct_udsp_info udsp_info;
        lnet_nid_t *nidp;
        int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
        int i, j, k;
@@ -2875,6 +3017,27 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
                        if (backup)
                                continue;
 
+                       if (detail < 4)
+                               goto continue_without_udsp_info;
+
+                       LIBCFS_IOC_INIT_V2(udsp_info, cud_hdr);
+                       udsp_info.cud_nid = *nidp;
+                       udsp_info.cud_peer = true;
+                       rc = l_ioctl(LNET_DEV_ID,
+                                       IOC_LIBCFS_GET_CONST_UDSP_INFO,
+                                       &udsp_info);
+                       if (rc != 0) {
+                               l_errno = errno;
+                               goto continue_without_udsp_info;
+                       }
+
+                       rc = create_remote_udsp_info(&udsp_info, peer_ni);
+                       if (rc) {
+                               l_errno = errno;
+                               goto out;
+                       }
+
+continue_without_udsp_info:
                        if (cYAML_create_string(peer_ni, "state",
                                                lpni_cri->cr_aliveness)
                            == NULL)
@@ -2979,6 +3142,16 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no,
                                                hstats->hlpni_network_timeout)
                                                        == NULL)
                                goto out;
+                       if (cYAML_create_number(yhstats, "ping_count",
+                                               hstats->hlpni_ping_count)
+                                                       == NULL)
+                               goto out;
+
+                       if (cYAML_create_number(yhstats, "next_ping",
+                                               hstats->hlpni_next_ping)
+                                                       == NULL)
+                               goto out;
+
                }
        }
 
@@ -3511,6 +3684,31 @@ int lustre_lnet_show_response_tracking(int seq_no, struct cYAML **show_rc,
                                       show_rc, err_rc, l_errno);
 }
 
+int lustre_lnet_show_recovery_limit(int seq_no, struct cYAML **show_rc,
+                                   struct cYAML **err_rc)
+{
+       int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
+       char val[LNET_MAX_STR_LEN];
+       int recov_limit = -1, l_errno = 0;
+       char err_str[LNET_MAX_STR_LEN];
+
+       snprintf(err_str, sizeof(err_str), "\"out of memory\"");
+
+       rc = read_sysfs_file(modparam_path, "lnet_recovery_limit", val,
+                            1, sizeof(val));
+       if (rc) {
+               l_errno = -errno;
+               snprintf(err_str, sizeof(err_str),
+                        "\"cannot get lnet_recovery_limit value: %d\"", rc);
+       } else {
+               recov_limit = atoi(val);
+       }
+
+       return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+                                      "recovery_limit", recov_limit,
+                                      show_rc, err_rc, l_errno);
+}
+
 int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
                              struct cYAML **err_rc)
 {
@@ -3530,7 +3728,7 @@ int lustre_lnet_show_max_intf(int seq_no, struct cYAML **show_rc,
        }
 
        return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
-                                      "max_intf", max_intf, show_rc,
+                                      "max_interfaces", max_intf, show_rc,
                                       err_rc, l_errno);
 }
 
@@ -4493,16 +4691,71 @@ static int handle_yaml_show_numa(struct cYAML *tree, struct cYAML **show_rc,
                                           show_rc, err_rc);
 }
 
+static int handle_yaml_del_udsp(struct cYAML *tree, struct cYAML **show_rc,
+                               struct cYAML **err_rc)
+{
+       struct cYAML *seq_no, *idx;
+
+       seq_no = cYAML_get_object_item(tree, "seq_no");
+       idx = cYAML_get_object_item(tree, "idx");
+
+       return lustre_lnet_del_udsp(idx ? idx->cy_valueint : -1,
+                                   seq_no ? seq_no->cy_valueint : -1,
+                                   err_rc);
+}
+
+static int handle_yaml_config_udsp(struct cYAML *tree, struct cYAML **show_rc,
+                                  struct cYAML **err_rc)
+{
+       struct cYAML *seq_no, *src, *rte, *dst, *prio, *idx;
+       union lnet_udsp_action action;
+
+       seq_no = cYAML_get_object_item(tree, "seq_no");
+       src = cYAML_get_object_item(tree, "src");
+       rte = cYAML_get_object_item(tree, "rte");
+       dst = cYAML_get_object_item(tree, "dst");
+       prio = cYAML_get_object_item(tree, "priority");
+       idx = cYAML_get_object_item(tree, "idx");
+
+       action.udsp_priority = prio ? prio->cy_valueint : -1;
+
+       return lustre_lnet_add_udsp(src ? src->cy_valuestring : NULL,
+                                   dst ? dst->cy_valuestring : NULL,
+                                   rte ? rte->cy_valuestring : NULL,
+                                   prio ? "priority" : "",
+                                   &action,
+                                   idx ? idx->cy_valueint : -1,
+                                   seq_no ? seq_no->cy_valueint : -1,
+                                   err_rc);
+}
+
+static int handle_yaml_show_udsp(struct cYAML *tree, struct cYAML **show_rc,
+                                struct cYAML **err_rc)
+{
+       struct cYAML *seq_no;
+       struct cYAML *idx;
+
+       seq_no = cYAML_get_object_item(tree, "seq_no");
+       idx = cYAML_get_object_item(tree, "idx");
+
+       return lustre_lnet_show_udsp(idx ? idx->cy_valueint : -1,
+                                    seq_no ? seq_no->cy_valueint : -1,
+                                    show_rc, err_rc);
+}
+
 static int handle_yaml_config_global_settings(struct cYAML *tree,
                                              struct cYAML **show_rc,
                                              struct cYAML **err_rc)
 {
        struct cYAML *max_intf, *numa, *discovery, *retry, *tto, *seq_no,
-                    *sen, *recov, *rsen, *drop_asym_route, *rsp_tracking;
+                    *sen, *recov, *rsen, *drop_asym_route, *rsp_tracking,
+                    *recov_limit;
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_config_max_intf(max_intf->cy_valueint,
                                                 seq_no ? seq_no->cy_valueint
@@ -4572,6 +4825,13 @@ static int handle_yaml_config_global_settings(struct cYAML *tree,
                                                        : -1,
                                                     err_rc);
 
+       recov_limit = cYAML_get_object_item(tree, "recovery_limit");
+       if (recov_limit)
+               rc = lustre_lnet_config_recovery_limit(recov_limit->cy_valueint,
+                                                      seq_no ? seq_no->cy_valueint
+                                                       : -1,
+                                                      err_rc);
+
        return rc;
 }
 
@@ -4583,7 +4843,9 @@ static int handle_yaml_del_global_settings(struct cYAML *tree,
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_config_max_intf(LNET_INTERFACES_MAX_DEFAULT,
                                                 seq_no ? seq_no->cy_valueint
@@ -4619,11 +4881,14 @@ static int handle_yaml_show_global_settings(struct cYAML *tree,
                                            struct cYAML **err_rc)
 {
        struct cYAML *max_intf, *numa, *discovery, *retry, *tto, *seq_no,
-                    *sen, *recov, *rsen, *drop_asym_route, *rsp_tracking;
+                    *sen, *recov, *rsen, *drop_asym_route, *rsp_tracking,
+                    *recov_limit;
        int rc = 0;
 
        seq_no = cYAML_get_object_item(tree, "seq_no");
-       max_intf = cYAML_get_object_item(tree, "max_intf");
+       max_intf = cYAML_get_object_item(tree, "max_interfaces");
+       if (!max_intf) /* try legacy name */
+               max_intf = cYAML_get_object_item(tree, "max_intf");
        if (max_intf)
                rc = lustre_lnet_show_max_intf(seq_no ? seq_no->cy_valueint
                                                        : -1,
@@ -4684,6 +4949,13 @@ static int handle_yaml_show_global_settings(struct cYAML *tree,
                                                        -1,
                                                        show_rc, err_rc);
 
+       recov_limit = cYAML_get_object_item(tree, "recovery_limit");
+       if (recov_limit)
+               rc = lustre_lnet_show_recovery_limit(seq_no ?
+                                                    seq_no->cy_valueint :
+                                                    -1,
+                                                    show_rc, err_rc);
+
        return rc;
 }
 
@@ -4739,6 +5011,7 @@ static struct lookup_cmd_hdlr_tbl lookup_config_tbl[] = {
        { .name = "numa",       .cb = handle_yaml_config_numa },
        { .name = "ping",       .cb = handle_yaml_no_op },
        { .name = "discover",   .cb = handle_yaml_no_op },
+       { .name = "udsp",       .cb = handle_yaml_config_udsp },
        { .name = NULL } };
 
 static struct lookup_cmd_hdlr_tbl lookup_del_tbl[] = {
@@ -4753,6 +5026,7 @@ static struct lookup_cmd_hdlr_tbl lookup_del_tbl[] = {
        { .name = "numa",       .cb = handle_yaml_del_numa },
        { .name = "ping",       .cb = handle_yaml_no_op },
        { .name = "discover",   .cb = handle_yaml_no_op },
+       { .name = "udsp",       .cb = handle_yaml_del_udsp },
        { .name = NULL } };
 
 static struct lookup_cmd_hdlr_tbl lookup_show_tbl[] = {
@@ -4767,6 +5041,7 @@ static struct lookup_cmd_hdlr_tbl lookup_show_tbl[] = {
        { .name = "numa",       .cb = handle_yaml_show_numa },
        { .name = "ping",       .cb = handle_yaml_no_op },
        { .name = "discover",   .cb = handle_yaml_no_op },
+       { .name = "udsp",       .cb = handle_yaml_show_udsp },
        { .name = NULL } };
 
 static struct lookup_cmd_hdlr_tbl lookup_exec_tbl[] = {