+ *show_rc = root;
+ }
+
+ cYAML_build_error(rc, seq_no, SHOW_CMD, "peer", err_str,
+ err_rc);
+
+ return rc;
+}
+
+static void add_to_global(struct cYAML *show_rc, struct cYAML *node,
+ struct cYAML *root)
+{
+ struct cYAML *show_node;
+
+ show_node = cYAML_get_object_item(show_rc, "global");
+ if (show_node != NULL)
+ cYAML_insert_sibling(show_node->cy_child,
+ node->cy_child);
+ else
+ cYAML_insert_sibling(show_rc->cy_child,
+ node);
+ free(root);
+}
+
+static int build_global_yaml_entry(char *err_str, int err_len, int seq_no,
+ char *name, __u64 value,
+ struct cYAML **show_rc,
+ struct cYAML **err_rc, int err)
+{
+ int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
+ struct cYAML *root = NULL, *global = NULL;
+
+ if (err) {
+ rc = err;
+ goto out;
+ }
+
+ root = cYAML_create_object(NULL, NULL);
+ if (root == NULL)
+ goto out;
+
+ global = cYAML_create_object(root, "global");
+ if (global == NULL)
+ goto out;
+
+ if (cYAML_create_number(global, name,
+ value) == NULL)
+ goto out;
+
+ if (show_rc == NULL)
+ cYAML_print_tree(root);
+
+ snprintf(err_str, err_len, "\"success\"");
+
+ rc = LUSTRE_CFG_RC_NO_ERR;
+
+out:
+ if (show_rc == NULL || rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_free_tree(root);
+ } else if (show_rc != NULL && *show_rc != NULL) {
+ add_to_global(*show_rc, global, root);
+ } else {
+ *show_rc = root;
+ }
+
+ cYAML_build_error(rc, seq_no, SHOW_CMD, "global", err_str, err_rc);
+
+ return rc;
+}
+
+static int ioctl_show_global_values(int ioc, int seq_no, char *name,
+ struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ struct lnet_ioctl_set_value data;
+ int rc;
+ int l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ LIBCFS_IOC_INIT_V2(data, sv_hdr);
+
+ rc = l_ioctl(LNET_DEV_ID, ioc, &data);
+ if (rc != 0) {
+ l_errno = -errno;
+ snprintf(err_str,
+ sizeof(err_str),
+ "\"cannot get %s: %s\"",
+ name, strerror(l_errno));
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no, name,
+ data.sv_value, show_rc, err_rc, l_errno);
+}
+
+int lustre_lnet_show_recov_intrv(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 intrv = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "lnet_recovery_interval", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get recovery interval: %d\"", rc);
+ } else {
+ intrv = atoi(val);
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "recovery_interval", intrv, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_show_hsensitivity(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 sen = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "lnet_health_sensitivity", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get health sensitivity: %d\"", rc);
+ } else {
+ sen = atoi(val);
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "health_sensitivity", sen, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_show_rtr_sensitivity(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 sen = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "router_sensitivity_percentage", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get router sensitivity percentage: %d\"", rc);
+ } else {
+ sen = atoi(val);
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "router_sensitivity", sen, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_show_lnd_timeout(int seq_no, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ char val[LNET_MAX_STR_LEN];
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+ int lnd_to = -1;
+ int l_errno = 0;
+ int rc;
+ int fd;
+ glob_t path;
+
+ rc = cfs_get_param_paths(&path, "lnet_lnd_timeout");
+ if (rc < 0) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get LND timeout: %d\"", rc);
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "lnd_timeout", lnd_to, show_rc,
+ err_rc, l_errno);
+ }
+
+ fd = open(path.gl_pathv[0], O_RDONLY);
+ if (fd < 0) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"error opening %s\"", path.gl_pathv[0]);
+ goto failed;
+ }
+
+ rc = read(fd, val, sizeof(val));
+ if (rc < 0)
+ l_errno = -errno;
+
+ close(fd);
+
+ if (rc < 0) {
+ snprintf(err_str, sizeof(err_str),
+ "\"error reading %s\"", path.gl_pathv[0]);
+ goto failed;
+ }
+
+ lnd_to = atoi(val);
+
+failed:
+ cfs_free_param_data(&path);
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "lnd_timeout", lnd_to, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_show_transaction_to(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 tto = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "lnet_transaction_timeout", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get transaction timeout: %d\"", rc);
+ } else {
+ tto = atoi(val);
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "transaction_timeout", tto, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_show_retry_count(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 retry_count = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "lnet_retry_count", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get retry count: %d\"", rc);
+ } else {
+ retry_count = atoi(val);
+ }
+
+ return build_global_yaml_entry(err_str, sizeof(err_str), seq_no,
+ "retry_count", retry_count, show_rc,
+ err_rc, l_errno);
+}
+
+int lustre_lnet_calc_service_id(__u64 *service_id)
+{
+ int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
+ char val[LNET_MAX_STR_LEN];
+ int service_port = -1, l_errno = 0;
+
+ rc = read_sysfs_file(o2ib_modparam_path, "service", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = errno;
+ fprintf(stderr, "error:\n msg: \"cannot get service port: %s (%d)\"\n",
+ strerror(l_errno), -l_errno);
+ return rc;
+ } else {
+ service_port = atoi(val);
+ }
+
+ *service_id = htobe64(((__u64)RDMA_PS_TCP << 16) + service_port);
+
+ return LUSTRE_CFG_RC_NO_ERR;
+}
+
+int show_recovery_queue(enum lnet_health_type type, char *name, int seq_no,
+ struct cYAML **show_rc, struct cYAML **err_rc)
+{
+ struct lnet_ioctl_recovery_list nid_list;
+ struct cYAML *root = NULL, *nids = NULL;
+ int rc, i;
+ char err_str[LNET_MAX_STR_LEN] = "failed to print recovery queue\n";
+
+ LIBCFS_IOC_INIT_V2(nid_list, rlst_hdr);
+ nid_list.rlst_type = type;
+
+ rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_GET_RECOVERY_QUEUE, &nid_list);
+ if (rc) {
+ rc = errno;
+ goto out;
+ }
+
+ if (nid_list.rlst_num_nids == 0)
+ goto out;
+
+ root = cYAML_create_object(NULL, NULL);
+ if (root == NULL)
+ goto out;
+
+ nids = cYAML_create_object(root, name);
+ if (nids == NULL)
+ goto out;
+
+ rc = -EINVAL;
+
+ for (i = 0; i < nid_list.rlst_num_nids; i++) {
+ char nidenum[LNET_MAX_STR_LEN];
+ snprintf(nidenum, sizeof(nidenum), "nid-%d", i);
+ if (!cYAML_create_string(nids, nidenum,
+ libcfs_nid2str(nid_list.rlst_nid_array[i])))
+ goto out;
+ }
+
+ snprintf(err_str, sizeof(err_str), "success\n");
+
+ rc = 0;
+
+out:
+ if (show_rc == NULL || rc != LUSTRE_CFG_RC_NO_ERR) {
+ cYAML_free_tree(root);
+ } else if (show_rc != NULL && *show_rc != NULL) {
+ struct cYAML *show_node;
+ /* find the net node, if one doesn't exist
+ * then insert one. Otherwise add to the one there
+ */
+ show_node = cYAML_get_object_item(*show_rc, name);
+ if (show_node != NULL && cYAML_is_sequence(show_node)) {
+ cYAML_insert_child(show_node, nids);
+ free(nids);
+ free(root);
+ } else if (show_node == NULL) {
+ cYAML_insert_sibling((*show_rc)->cy_child,
+ nids);
+ free(root);
+ } else {
+ cYAML_free_tree(root);
+ }
+ } else {
+ *show_rc = root;
+ }
+
+ cYAML_build_error(rc, seq_no, SHOW_CMD, name, err_str, err_rc);
+
+ return rc;
+}
+
+int lustre_lnet_show_local_ni_recovq(int seq_no, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ return show_recovery_queue(LNET_HEALTH_TYPE_LOCAL_NI, "local NI recovery",
+ seq_no, show_rc, err_rc);
+}
+
+int lustre_lnet_show_peer_ni_recovq(int seq_no, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ return show_recovery_queue(LNET_HEALTH_TYPE_PEER_NI, "peer NI recovery",
+ seq_no, show_rc, err_rc);
+}
+
+int lustre_lnet_show_response_tracking(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 rsp_tracking = -1, l_errno = 0;
+ char err_str[LNET_MAX_STR_LEN] = "\"out of memory\"";
+
+ rc = read_sysfs_file(modparam_path, "lnet_response_tracking", val,
+ 1, sizeof(val));
+ if (rc) {
+ l_errno = -errno;
+ snprintf(err_str, sizeof(err_str),
+ "\"cannot get lnet_response_tracking value: %d\"", rc);
+ } else {
+ rsp_tracking = atoi(val);