__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;
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;
};
/*
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 {
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 {
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,
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);
}
/*
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);
}
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);
*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;
}
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;
* 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;
*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),
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)
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;
if (cYAML_create_string(peer_ni, "nid",
libcfs_nid2str
- (peer_info->prcfg_cfg_nid))
+ (peer_info.prcfg_cfg_nid))
== NULL)
goto out;
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;