From: Amir Shehata Date: Mon, 17 Apr 2017 23:30:32 +0000 (-0700) Subject: LU-9119 lnet: Normalize ioctl interface X-Git-Tag: 2.9.57~21 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=535d83288b267a513348e756fca65787804b895c;p=fs%2Flustre-release.git LU-9119 lnet: Normalize ioctl interface To avoid backwards compatibility issues between base MR and Dynamic Discovery standardize the ioctl interface by bringing in changes to the interface required by Dynamic Discovery now. Test-Parameters: trivial Signed-off-by: Amir Shehata Change-Id: I014d74943b893ec24e3d42e1eb6824d755460c2b Reviewed-on: https://review.whamcloud.com/26689 Tested-by: Jenkins Reviewed-by: Olaf Weber Tested-by: Maloo Reviewed-by: Doug Oucharek Reviewed-by: Oleg Drokin --- diff --git a/lnet/include/lnet/lib-dlc.h b/lnet/include/lnet/lib-dlc.h index f8db465..360383d 100644 --- a/lnet/include/lnet/lib-dlc.h +++ b/lnet/include/lnet/lib-dlc.h @@ -103,6 +103,17 @@ struct lnet_ioctl_pool_cfg { __u32 pl_routing; }; +struct lnet_ioctl_ping_data { + struct libcfs_ioctl_hdr ping_hdr; + + __u32 op_param; + __u32 ping_count; + __u32 ping_flags; + bool mr_info; + lnet_process_id_t ping_id; + lnet_process_id_t __user *ping_buf; +}; + struct lnet_ioctl_config_data { struct libcfs_ioctl_hdr cfg_hdr; @@ -137,10 +148,26 @@ struct lnet_ioctl_config_data { char cfg_bulk[0]; }; +struct lnet_ioctl_comm_count { + __u32 ico_get_count; + __u32 ico_put_count; + __u32 ico_reply_count; + __u32 ico_ack_count; + __u32 ico_hello_count; +}; + struct lnet_ioctl_element_stats { - __u32 send_count; - __u32 recv_count; - __u32 drop_count; + __u32 iel_send_count; + __u32 iel_recv_count; + __u32 iel_drop_count; +}; + +struct lnet_ioctl_element_msg_stats { + struct libcfs_ioctl_hdr im_hdr; + __u32 im_idx; + struct lnet_ioctl_comm_count im_send_stats; + struct lnet_ioctl_comm_count im_recv_stats; + struct lnet_ioctl_comm_count im_drop_stats; }; /* @@ -158,14 +185,14 @@ struct lnet_ioctl_config_ni { lnet_nid_t lic_nid; char lic_ni_intf[LNET_MAX_INTERFACES][LNET_MAX_STR_LEN]; char lic_legacy_ip2nets[LNET_MAX_STR_LEN]; - __u32 lic_cpts[LNET_MAX_SHOW_NUM_CPT]; + __u32 lic_cpts[LNET_MAX_SHOW_NUM_CPT]; __u32 lic_ncpts; __u32 lic_status; __u32 lic_tcp_bonding; __u32 lic_idx; __s32 lic_dev_cpt; char pad[4]; - char lic_bulk[0]; + char lic_bulk[0]; }; struct lnet_peer_ni_credit_info { @@ -195,9 +222,11 @@ struct lnet_ioctl_peer_cfg { struct libcfs_ioctl_hdr prcfg_hdr; lnet_nid_t prcfg_prim_nid; lnet_nid_t prcfg_cfg_nid; - __u32 prcfg_idx; + __u32 prcfg_count; bool prcfg_mr; - char prcfg_bulk[0]; + __u32 prcfg_state; + __u32 prcfg_size; + void __user *prcfg_bulk; }; struct lnet_ioctl_numa_range { diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index 11c58fb..37a0b11 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -817,8 +817,9 @@ bool lnet_peer_is_ni_pref_locked(struct lnet_peer_ni *lpni, int lnet_add_peer_ni_to_peer(lnet_nid_t key_nid, lnet_nid_t nid, bool mr); int lnet_del_peer_ni_from_peer(lnet_nid_t key_nid, lnet_nid_t nid); int lnet_get_peer_info(__u32 idx, lnet_nid_t *primary_nid, lnet_nid_t *nid, - bool *mr, struct lnet_peer_ni_credit_info *peer_ni_info, - struct lnet_ioctl_element_stats *peer_ni_stats); + bool *mr, + struct lnet_peer_ni_credit_info __user *peer_ni_info, + struct lnet_ioctl_element_stats __user *peer_ni_stats); 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 38fe93a..204fe49 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -1974,8 +1974,8 @@ lnet_fill_ni_info(struct lnet_ni *ni, struct lnet_ioctl_config_ni *cfg_ni, memcpy(&tun->lt_cmn, &ni->ni_net->net_tunables, sizeof(tun->lt_cmn)); if (stats) { - stats->send_count = atomic_read(&ni->ni_stats.send_count); - stats->recv_count = atomic_read(&ni->ni_stats.recv_count); + stats->iel_send_count = atomic_read(&ni->ni_stats.send_count); + stats->iel_recv_count = atomic_read(&ni->ni_stats.recv_count); } /* @@ -2834,20 +2834,19 @@ LNetCtl(unsigned int cmd, void *arg) case IOC_LIBCFS_GET_PEER_NI: { struct lnet_ioctl_peer_cfg *cfg = arg; - struct lnet_peer_ni_credit_info *lpni_cri; - struct lnet_ioctl_element_stats *lpni_stats; - size_t total = sizeof(*cfg) + sizeof(*lpni_cri) + - sizeof(*lpni_stats); + struct lnet_peer_ni_credit_info __user *lpni_cri; + struct lnet_ioctl_element_stats __user *lpni_stats; + size_t usr_size = sizeof(*lpni_cri) + sizeof(*lpni_stats); - if (cfg->prcfg_hdr.ioc_len < total) + if ((cfg->prcfg_hdr.ioc_len != sizeof(*cfg)) || + (cfg->prcfg_size != usr_size)) return -EINVAL; - lpni_cri = (struct lnet_peer_ni_credit_info*) cfg->prcfg_bulk; - lpni_stats = (struct lnet_ioctl_element_stats *) - (cfg->prcfg_bulk + sizeof(*lpni_cri)); + lpni_cri = cfg->prcfg_bulk; + lpni_stats = cfg->prcfg_bulk + sizeof(*lpni_cri); mutex_lock(&the_lnet.ln_api_mutex); - rc = lnet_get_peer_info(cfg->prcfg_idx, &cfg->prcfg_prim_nid, + rc = lnet_get_peer_info(cfg->prcfg_count, &cfg->prcfg_prim_nid, &cfg->prcfg_cfg_nid, &cfg->prcfg_mr, lpni_cri, lpni_stats); mutex_unlock(&the_lnet.ln_api_mutex); diff --git a/lnet/lnet/peer.c b/lnet/lnet/peer.c index d1c1342..7b506a4 100644 --- a/lnet/lnet/peer.c +++ b/lnet/lnet/peer.c @@ -1173,12 +1173,16 @@ int lnet_get_peer_ni_info(__u32 peer_index, __u64 *nid, } int lnet_get_peer_info(__u32 idx, lnet_nid_t *primary_nid, lnet_nid_t *nid, - bool *mr, struct lnet_peer_ni_credit_info *peer_ni_info, - struct lnet_ioctl_element_stats *peer_ni_stats) + bool *mr, + struct lnet_peer_ni_credit_info __user *peer_ni_info, + struct lnet_ioctl_element_stats __user *peer_ni_stats) { struct lnet_peer_ni *lpni = NULL; struct lnet_peer_net *lpn = NULL; struct lnet_peer *lp = NULL; + struct lnet_peer_ni_credit_info ni_info; + struct lnet_ioctl_element_stats ni_stats; + int rc; lpni = lnet_get_peer_ni_idx_locked(idx, &lpn, &lp); @@ -1188,24 +1192,36 @@ int lnet_get_peer_info(__u32 idx, lnet_nid_t *primary_nid, lnet_nid_t *nid, *primary_nid = lp->lp_primary_nid; *mr = lp->lp_multi_rail; *nid = lpni->lpni_nid; - snprintf(peer_ni_info->cr_aliveness, LNET_MAX_STR_LEN, "NA"); + snprintf(ni_info.cr_aliveness, LNET_MAX_STR_LEN, "NA"); if (lnet_isrouter(lpni) || lnet_peer_aliveness_enabled(lpni)) - snprintf(peer_ni_info->cr_aliveness, LNET_MAX_STR_LEN, + snprintf(ni_info.cr_aliveness, LNET_MAX_STR_LEN, lpni->lpni_alive ? "up" : "down"); - peer_ni_info->cr_refcount = atomic_read(&lpni->lpni_refcount); - peer_ni_info->cr_ni_peer_tx_credits = (lpni->lpni_net != NULL) ? + ni_info.cr_refcount = atomic_read(&lpni->lpni_refcount); + ni_info.cr_ni_peer_tx_credits = (lpni->lpni_net != NULL) ? lpni->lpni_net->net_tunables.lct_peer_tx_credits : 0; - peer_ni_info->cr_peer_tx_credits = lpni->lpni_txcredits; - peer_ni_info->cr_peer_rtr_credits = lpni->lpni_rtrcredits; - peer_ni_info->cr_peer_min_rtr_credits = lpni->lpni_minrtrcredits; - peer_ni_info->cr_peer_min_tx_credits = lpni->lpni_mintxcredits; - peer_ni_info->cr_peer_tx_qnob = lpni->lpni_txqnob; + ni_info.cr_peer_tx_credits = lpni->lpni_txcredits; + ni_info.cr_peer_rtr_credits = lpni->lpni_rtrcredits; + ni_info.cr_peer_min_rtr_credits = lpni->lpni_minrtrcredits; + ni_info.cr_peer_min_tx_credits = lpni->lpni_mintxcredits; + ni_info.cr_peer_tx_qnob = lpni->lpni_txqnob; + ni_info.cr_ncpt = lpni->lpni_cpt; - peer_ni_stats->send_count = atomic_read(&lpni->lpni_stats.send_count); - peer_ni_stats->recv_count = atomic_read(&lpni->lpni_stats.recv_count); - peer_ni_stats->drop_count = atomic_read(&lpni->lpni_stats.drop_count); + ni_stats.iel_send_count = atomic_read(&lpni->lpni_stats.send_count); + ni_stats.iel_recv_count = atomic_read(&lpni->lpni_stats.recv_count); + ni_stats.iel_drop_count = atomic_read(&lpni->lpni_stats.drop_count); - return 0; + /* If copy_to_user fails */ + rc = -EFAULT; + if (copy_to_user(peer_ni_info, &ni_info, sizeof(ni_info))) + goto copy_failed; + + if (copy_to_user(peer_ni_stats, &ni_stats, sizeof(ni_stats))) + goto copy_failed; + + rc = 0; + +copy_failed: + return rc; } diff --git a/lnet/utils/lnetconfig/liblnetconfig.c b/lnet/utils/lnetconfig/liblnetconfig.c index 2515a02..2313a28 100644 --- a/lnet/utils/lnetconfig/liblnetconfig.c +++ b/lnet/utils/lnetconfig/liblnetconfig.c @@ -1647,17 +1647,17 @@ int lustre_lnet_show_net(char *nw, int detail, int seq_no, goto out; if (cYAML_create_number(statistics, "send_count", - stats->send_count) + stats->iel_send_count) == NULL) goto out; if (cYAML_create_number(statistics, "recv_count", - stats->recv_count) + stats->iel_recv_count) == NULL) goto out; if (cYAML_create_number(statistics, "drop_count", - stats->drop_count) + stats->iel_drop_count) == NULL) goto out; @@ -2012,7 +2012,7 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, * TODO: This function is changing in a future patch to accommodate * PEER_LIST and proper filtering on any nid of the peer */ - struct lnet_ioctl_peer_cfg *peer_info; + struct lnet_ioctl_peer_cfg peer_info; struct lnet_peer_ni_credit_info *lpni_cri; struct lnet_ioctl_element_stats *lpni_stats; int rc = LUSTRE_CFG_RC_OUT_OF_MEM, ncpt = 0, i = 0, j = 0; @@ -2021,9 +2021,8 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, *first_seq = NULL, *peer_root = NULL, *tmp = NULL; char err_str[LNET_MAX_STR_LEN]; lnet_nid_t prev_primary_nid = LNET_NID_ANY, primary_nid = LNET_NID_ANY; - int data_size = sizeof(*peer_info) + sizeof(*lpni_cri) + - sizeof(*lpni_stats); - char *data = calloc(data_size, 1); + int data_size = sizeof(*lpni_cri) + sizeof(*lpni_stats); + char *data = malloc(data_size); bool new_peer = true; snprintf(err_str, sizeof(err_str), @@ -2032,8 +2031,6 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, if (data == NULL) goto out; - peer_info = (struct lnet_ioctl_peer_cfg *)data; - /* create struct cYAML root object */ root = cYAML_create_object(NULL, NULL); if (root == NULL) @@ -2049,43 +2046,44 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, do { for (i = 0;; i++) { memset(data, 0, data_size); - LIBCFS_IOC_INIT_V2(*peer_info, prcfg_hdr); - peer_info->prcfg_hdr.ioc_len = data_size; - peer_info->prcfg_idx = i; + memset(&peer_info, 0, sizeof(peer_info)); + LIBCFS_IOC_INIT_V2(peer_info, prcfg_hdr); + peer_info.prcfg_hdr.ioc_len = sizeof(peer_info); + peer_info.prcfg_count = i; + peer_info.prcfg_bulk = (void *)data; + peer_info.prcfg_size = data_size; rc = l_ioctl(LNET_DEV_ID, - IOC_LIBCFS_GET_PEER_NI, peer_info); + IOC_LIBCFS_GET_PEER_NI, &peer_info); if (rc != 0) { l_errno = errno; break; } if (primary_nid != LNET_NID_ANY && - primary_nid != peer_info->prcfg_prim_nid) + primary_nid != peer_info.prcfg_prim_nid) continue; - lpni_cri = (struct lnet_peer_ni_credit_info*)peer_info->prcfg_bulk; - lpni_stats = (struct lnet_ioctl_element_stats *) - (peer_info->prcfg_bulk + - sizeof(*lpni_cri)); + lpni_cri = peer_info.prcfg_bulk; + lpni_stats = peer_info.prcfg_bulk + sizeof(*lpni_cri); peer = cYAML_create_seq_item(peer_root); if (peer == NULL) goto out; - if (peer_info->prcfg_prim_nid != prev_primary_nid) { - prev_primary_nid = peer_info->prcfg_prim_nid; + if (peer_info.prcfg_prim_nid != prev_primary_nid) { + prev_primary_nid = peer_info.prcfg_prim_nid; new_peer = true; } if (new_peer) { - lnet_nid_t pnid = peer_info->prcfg_prim_nid; + lnet_nid_t pnid = peer_info.prcfg_prim_nid; if (cYAML_create_string(peer, "primary nid", libcfs_nid2str(pnid)) == NULL) goto out; if (cYAML_create_string(peer, "Multi-Rail", - peer_info->prcfg_mr ? + peer_info.prcfg_mr ? "True" : "False") == NULL) goto out; @@ -2104,7 +2102,7 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, if (cYAML_create_string(peer_ni, "nid", libcfs_nid2str - (peer_info->prcfg_cfg_nid)) + (peer_info.prcfg_cfg_nid)) == NULL) goto out; @@ -2147,17 +2145,17 @@ int lustre_lnet_show_peer(char *knid, int detail, int seq_no, goto out; if (cYAML_create_number(peer_ni, "send_count", - lpni_stats->send_count) + lpni_stats->iel_send_count) == NULL) goto out; if (cYAML_create_number(peer_ni, "recv_count", - lpni_stats->recv_count) + lpni_stats->iel_recv_count) == NULL) goto out; if (cYAML_create_number(peer_ni, "drop_count", - lpni_stats->drop_count) + lpni_stats->iel_drop_count) == NULL) goto out;