#include <fcntl.h>
#include <ifaddrs.h>
#include "liblnetconfig.h"
-#include "cyaml.h"
#define CONFIG_CMD "configure"
#define UNCONFIG_CMD "unconfigure"
#define modparam_path "/sys/module/lnet/parameters/"
+const char *gmsg_stat_names[] = {"sent_stats", "received_stats",
+ "dropped_stats"};
+
/*
* lustre_lnet_ip_range_descr
* Describes an IP range.
void lustre_lnet_init_nw_descr(struct lnet_dlc_network_descr *nw_descr)
{
if (nw_descr != NULL) {
+ nw_descr->nw_id = 0;
INIT_LIST_HEAD(&nw_descr->network_on_rule);
INIT_LIST_HEAD(&nw_descr->nw_intflist);
}
int lustre_lnet_config_lib_init(void)
{
- return register_ioc_dev(LNET_DEV_ID, LNET_DEV_PATH,
- LNET_DEV_MAJOR, LNET_DEV_MINOR);
+ return register_ioc_dev(LNET_DEV_ID, LNET_DEV_PATH);
}
void lustre_lnet_config_lib_uninit(void)
if (nw == NULL || gw == NULL) {
snprintf(err_str,
sizeof(err_str),
- "\"missing mandatory parameter(s): '%s'\"",
+ "\"missing mandatory parameter in route config:'%s'\"",
(nw == NULL && gw == NULL) ? "network, gateway" :
(nw == NULL) ? "network" : "gateway");
rc = LUSTRE_CFG_RC_MISSING_PARAM;
if (nw == NULL || gw == NULL) {
snprintf(err_str,
sizeof(err_str),
- "\"missing mandatory parameter(s): '%s'\"",
+ "\"missing mandatory parameter in route delete: '%s'\"",
(nw == NULL && gw == NULL) ? "network, gateway" :
(nw == NULL) ? "network" : "gateway");
rc = LUSTRE_CFG_RC_MISSING_PARAM;
snprintf(err_str, sizeof(err_str), "\"success\"");
- if (ip2net == NULL && nw_descr == NULL) {
+ if (ip2net == NULL && (nw_descr == NULL || nw_descr->nw_id == 0 ||
+ list_empty(&nw_descr->nw_intflist))) {
snprintf(err_str,
sizeof(err_str),
- "\"mandatory parameters not specified.\"");
+ "\"missing mandatory parameters in NI config: '%s'\"",
+ (nw_descr == NULL) ? "network , interface" :
+ (nw_descr->nw_id == 0) ? "network" : "interface");
rc = LUSTRE_CFG_RC_MISSING_PARAM;
goto out;
}
snprintf(err_str, sizeof(err_str), "\"success\"");
- if (nw_descr == NULL) {
+ if (nw_descr == NULL || nw_descr->nw_id == 0 ||
+ list_empty(&nw_descr->nw_intflist)) {
snprintf(err_str,
sizeof(err_str),
- "\"missing mandatory parameter\"");
+ "\"missing mandatory parameter in deleting NI: '%s'\"",
+ (nw_descr == NULL) ? "network , interface" :
+ (nw_descr->nw_id == 0) ? "network" : "interface");
rc = LUSTRE_CFG_RC_MISSING_PARAM;
goto out;
}
return rc;
}
+static bool
+add_msg_stats_to_yaml_blk(struct cYAML *yaml,
+ struct lnet_ioctl_comm_count *counts)
+{
+ if (cYAML_create_number(yaml, "put",
+ counts->ico_put_count)
+ == NULL)
+ return false;
+ if (cYAML_create_number(yaml, "get",
+ counts->ico_get_count)
+ == NULL)
+ return false;
+ if (cYAML_create_number(yaml, "reply",
+ counts->ico_reply_count)
+ == NULL)
+ return false;
+ if (cYAML_create_number(yaml, "ack",
+ counts->ico_ack_count)
+ == NULL)
+ return false;
+ if (cYAML_create_number(yaml, "hello",
+ counts->ico_hello_count)
+ == NULL)
+ return false;
+
+ return true;
+}
+
+static struct lnet_ioctl_comm_count *
+get_counts(struct lnet_ioctl_element_msg_stats *msg_stats, int idx)
+{
+ if (idx == 0)
+ return &msg_stats->im_send_stats;
+ if (idx == 1)
+ return &msg_stats->im_recv_stats;
+ if (idx == 2)
+ return &msg_stats->im_drop_stats;
+
+ return NULL;
+}
+
int lustre_lnet_show_net(char *nw, int detail, int seq_no,
struct cYAML **show_rc, struct cYAML **err_rc)
{
struct lnet_ioctl_config_ni *ni_data;
struct lnet_ioctl_config_lnd_tunables *lnd;
struct lnet_ioctl_element_stats *stats;
+ struct lnet_ioctl_element_msg_stats msg_stats;
__u32 net = LNET_NIDNET(LNET_NID_ANY);
__u32 prev_net = LNET_NIDNET(LNET_NID_ANY);
int rc = LUSTRE_CFG_RC_OUT_OF_MEM, i, j;
if (detail) {
char *limit;
+ int k;
statistics = cYAML_create_object(item, "statistics");
if (statistics == NULL)
== NULL)
goto out;
+ if (detail < 2)
+ goto continue_without_msg_stats;
+
+ LIBCFS_IOC_INIT_V2(msg_stats, im_hdr);
+ msg_stats.im_hdr.ioc_len = sizeof(msg_stats);
+ msg_stats.im_idx = i;
+
+ rc = l_ioctl(LNET_DEV_ID,
+ IOC_LIBCFS_GET_LOCAL_NI_MSG_STATS,
+ &msg_stats);
+ if (rc != 0) {
+ l_errno = errno;
+ goto continue_without_msg_stats;
+ }
+
+ for (k = 0; k < 3; k++) {
+ struct lnet_ioctl_comm_count *counts;
+ struct cYAML *msg_statistics = NULL;
+
+ msg_statistics = cYAML_create_object(item,
+ (char *)gmsg_stat_names[k]);
+ if (msg_statistics == NULL)
+ goto out;
+
+ counts = get_counts(&msg_stats, k);
+ if (counts == NULL)
+ goto out;
+
+ if (!add_msg_stats_to_yaml_blk(msg_statistics,
+ counts))
+ goto out;
+ }
+
+continue_without_msg_stats:
tunables = cYAML_create_object(item, "tunables");
if (!tunables)
goto out;
struct lnet_ioctl_peer_cfg peer_info;
struct lnet_peer_ni_credit_info *lpni_cri;
struct lnet_ioctl_element_stats *lpni_stats;
+ struct lnet_ioctl_element_msg_stats *msg_stats;
lnet_nid_t *nidp;
int rc = LUSTRE_CFG_RC_OUT_OF_MEM;
- int i;
- int j;
+ int i, j, k;
int l_errno = 0;
__u32 count;
__u32 size;
struct cYAML *root = NULL, *peer = NULL, *peer_ni = NULL,
- *first_seq = NULL, *peer_root = NULL, *tmp = NULL;
+ *first_seq = NULL, *peer_root = NULL, *tmp = NULL,
+ *msg_statistics = NULL, *statistics = NULL;
char err_str[LNET_MAX_STR_LEN];
lnet_process_id_t *list = NULL;
void *data = NULL;
peer_info.prcfg_mr ? "True" : "False")
== NULL)
goto out;
+ /*
+ * print out the state of the peer only if details are
+ * requested
+ */
+ if (detail >= 3) {
+ if (cYAML_create_number(peer, "peer state",
+ peer_info.prcfg_state)
+ == NULL)
+ goto out;
+ }
tmp = cYAML_create_seq(peer, "peer ni");
if (tmp == NULL)
nidp = lpni_data;
lpni_cri = (void*)nidp + sizeof(nidp);
lpni_stats = (void *)lpni_cri + sizeof(*lpni_cri);
- lpni_data = (void *)lpni_stats + sizeof(*lpni_stats);
+ msg_stats = (void *)lpni_stats + sizeof(*lpni_stats);
+ lpni_data = (void *)msg_stats + sizeof(*msg_stats);
peer_ni = cYAML_create_seq_item(tmp);
if (peer_ni == NULL)
== NULL)
goto out;
- if (cYAML_create_number(peer_ni, "send_count",
+ if (cYAML_create_number(peer_ni, "refcount",
+ lpni_cri->cr_refcount) == NULL)
+ goto out;
+
+ statistics = cYAML_create_object(peer_ni, "statistics");
+ if (statistics == NULL)
+ goto out;
+
+ if (cYAML_create_number(statistics, "send_count",
lpni_stats->iel_send_count)
== NULL)
goto out;
- if (cYAML_create_number(peer_ni, "recv_count",
+ if (cYAML_create_number(statistics, "recv_count",
lpni_stats->iel_recv_count)
== NULL)
goto out;
- if (cYAML_create_number(peer_ni, "drop_count",
+ if (cYAML_create_number(statistics, "drop_count",
lpni_stats->iel_drop_count)
== NULL)
goto out;
- if (cYAML_create_number(peer_ni, "refcount",
- lpni_cri->cr_refcount) == NULL)
- goto out;
+ if (detail < 2)
+ continue;
+
+ for (k = 0; k < 3; k++) {
+ struct lnet_ioctl_comm_count *counts;
+
+ msg_statistics = cYAML_create_object(peer_ni,
+ (char *) gmsg_stat_names[k]);
+ if (msg_statistics == NULL)
+ goto out;
+
+ counts = get_counts(msg_stats, k);
+ if (counts == NULL)
+ goto out;
+
+ if (!add_msg_stats_to_yaml_blk(msg_statistics,
+ counts))
+ goto out;
+ }
+
}
}
show_rc, err_rc);
}
+static int handle_yaml_config_numa(struct cYAML *tree, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ struct cYAML *seq_no, *range;
+
+ seq_no = cYAML_get_object_item(tree, "seq_no");
+ range = cYAML_get_object_item(tree, "range");
+
+ return lustre_lnet_config_numa_range(range ? range->cy_valueint : -1,
+ seq_no ? seq_no->cy_valueint : -1,
+ err_rc);
+}
+
+static int handle_yaml_del_numa(struct cYAML *tree, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ struct cYAML *seq_no;
+
+ seq_no = cYAML_get_object_item(tree, "seq_no");
+
+ return lustre_lnet_config_numa_range(0, seq_no ? seq_no->cy_valueint : -1,
+ err_rc);
+}
+
+static int handle_yaml_show_numa(struct cYAML *tree, struct cYAML **show_rc,
+ struct cYAML **err_rc)
+{
+ struct cYAML *seq_no;
+
+ seq_no = cYAML_get_object_item(tree, "seq_no");
+
+ return lustre_lnet_show_numa_range(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)
{ .name = "buffers", .cb = handle_yaml_config_buffers },
{ .name = "statistics", .cb = handle_yaml_no_op },
{ .name = "global", .cb = handle_yaml_config_global_settings},
+ { .name = "numa", .cb = handle_yaml_config_numa },
{ .name = "ping", .cb = handle_yaml_no_op },
{ .name = "discover", .cb = handle_yaml_no_op },
{ .name = NULL } };
{ .name = "buffers", .cb = handle_yaml_no_op },
{ .name = "statistics", .cb = handle_yaml_no_op },
{ .name = "global", .cb = handle_yaml_del_global_settings},
+ { .name = "numa", .cb = handle_yaml_del_numa },
{ .name = "ping", .cb = handle_yaml_no_op },
{ .name = "discover", .cb = handle_yaml_no_op },
{ .name = NULL } };
{ .name = "buffers", .cb = handle_yaml_show_routing },
{ .name = "statistics", .cb = handle_yaml_show_stats },
{ .name = "global", .cb = handle_yaml_show_global_settings},
+ { .name = "numa", .cb = handle_yaml_show_numa },
{ .name = "ping", .cb = handle_yaml_no_op },
{ .name = "discover", .cb = handle_yaml_no_op },
{ .name = NULL } };
{ .name = "buffers", .cb = handle_yaml_no_op },
{ .name = "statistics", .cb = handle_yaml_no_op },
{ .name = "global", .cb = handle_yaml_no_op },
+ { .name = "numa", .cb = handle_yaml_no_op },
{ .name = "ping", .cb = handle_yaml_ping },
{ .name = "discover", .cb = handle_yaml_discover },
{ .name = NULL } };