From 1cb6cf3b691f9f3febd8a952ab5b3e3157c6e758 Mon Sep 17 00:00:00 2001 From: Amir Shehata Date: Wed, 22 Mar 2017 13:34:23 -0700 Subject: [PATCH] LU-9480 lnet: show peer state It is important to show the peer state when debugging. This patch exports the peer state from the kernel to user space, and is shown when the detail level requested in the peer show command is >= 3 Test-Parameters: trivial Signed-off-by: Amir Shehata Signed-off-by: Olaf Weber Change-Id: I1e169b2b7bf80671ea302f04c6fb948bbcbbb245 Reviewed-on: https://review.whamcloud.com/26130 Reviewed-by: Olaf Weber Reviewed-by: Dmitry Eremin --- lnet/include/lnet/lib-lnet.h | 4 +--- lnet/lnet/api-ni.c | 6 +----- lnet/lnet/peer.c | 21 ++++++++++----------- lnet/utils/lnetconfig/liblnetconfig.c | 10 ++++++++++ 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 8228e55..4e3f09c 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -888,9 +888,7 @@ bool lnet_peer_is_pref_nid_locked(struct lnet_peer_ni *lpni, lnet_nid_t nid); int lnet_peer_ni_set_non_mr_pref_nid(struct lnet_peer_ni *lpni, lnet_nid_t nid); int lnet_add_peer_ni(lnet_nid_t key_nid, lnet_nid_t nid, bool mr); int lnet_del_peer_ni(lnet_nid_t key_nid, lnet_nid_t nid); -int lnet_get_peer_info(lnet_nid_t *primary_nid, lnet_nid_t *nid, - __u32 *nnis, bool *mr, __u32 *sizep, - void __user *bulk); +int lnet_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk); int lnet_get_peer_ni_info(__u32 peer_index, __u64 *nid, char alivness[LNET_MAX_STR_LEN], __u32 *cpt_iter, __u32 *refcount, diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index 63eeaca..a9b1839 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -3238,11 +3238,7 @@ LNetCtl(unsigned int cmd, void *arg) return -EINVAL; mutex_lock(&the_lnet.ln_api_mutex); - rc = lnet_get_peer_info(&cfg->prcfg_prim_nid, - &cfg->prcfg_cfg_nid, - &cfg->prcfg_count, - &cfg->prcfg_mr, - &cfg->prcfg_size, + rc = lnet_get_peer_info(cfg, (void __user *)cfg->prcfg_bulk); mutex_unlock(&the_lnet.ln_api_mutex); return rc; diff --git a/lnet/lnet/peer.c b/lnet/lnet/peer.c index eb78fc7..507fcbe 100644 --- a/lnet/lnet/peer.c +++ b/lnet/lnet/peer.c @@ -3299,9 +3299,7 @@ int lnet_get_peer_ni_info(__u32 peer_index, __u64 *nid, } /* ln_api_mutex is held, which keeps the peer list stable */ -int lnet_get_peer_info(lnet_nid_t *primary_nid, lnet_nid_t *nidp, - __u32 *nnis, bool *mr, __u32 *sizep, - void __user *bulk) +int lnet_get_peer_info(struct lnet_ioctl_peer_cfg *cfg, void __user *bulk) { struct lnet_ioctl_element_stats *lpni_stats; struct lnet_ioctl_element_msg_stats *lpni_msg_stats; @@ -3312,7 +3310,7 @@ int lnet_get_peer_info(lnet_nid_t *primary_nid, lnet_nid_t *nidp, __u32 size; int rc; - lp = lnet_find_peer(*primary_nid); + lp = lnet_find_peer(cfg->prcfg_prim_nid); if (!lp) { rc = -ENOENT; @@ -3322,17 +3320,18 @@ int lnet_get_peer_info(lnet_nid_t *primary_nid, lnet_nid_t *nidp, size = sizeof(nid) + sizeof(*lpni_info) + sizeof(*lpni_stats) + sizeof(*lpni_msg_stats); size *= lp->lp_nnis; - if (size > *sizep) { - *sizep = size; + if (size > cfg->prcfg_size) { + cfg->prcfg_size = size; rc = -E2BIG; goto out_lp_decref; } - *primary_nid = lp->lp_primary_nid; - *mr = lnet_peer_is_multi_rail(lp); - *nidp = lp->lp_primary_nid; - *nnis = lp->lp_nnis; - *sizep = size; + cfg->prcfg_prim_nid = lp->lp_primary_nid; + cfg->prcfg_mr = lnet_peer_is_multi_rail(lp); + cfg->prcfg_cfg_nid = lp->lp_primary_nid; + cfg->prcfg_count = lp->lp_nnis; + cfg->prcfg_size = size; + cfg->prcfg_state = lp->lp_state; /* Allocate helper buffers. */ rc = -ENOMEM; diff --git a/lnet/utils/lnetconfig/liblnetconfig.c b/lnet/utils/lnetconfig/liblnetconfig.c index f172698..c32a494 100644 --- a/lnet/utils/lnetconfig/liblnetconfig.c +++ b/lnet/utils/lnetconfig/liblnetconfig.c @@ -2512,6 +2512,16 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, 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) -- 1.8.3.1