aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDotan Barak <dotanb@mellanox.co.il>2006-02-13 19:31:25 -0500
committerRoland Dreier <rolandd@cisco.com>2006-03-20 13:08:14 -0500
commit7ccc9a24e01258a31ee2b964215e4ddddd2a02c4 (patch)
tree486ab72c62f42952309ea764bc6bd30f56e87522
parenta74cd4af0bfa9578594acbb711a958104c93b772 (diff)
IB/uverbs: Support for query QP from userspace
Add support to uverbs to handle querying userspace QPs (queue pairs), including adding an ABI for marshalling requests and responses. The kernel midlayer already has the underlying ib_query_qp() function. Signed-off-by: Dotan Barak <dotanb@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/core/uverbs.h1
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c100
-rw-r--r--drivers/infiniband/core/uverbs_main.c1
-rw-r--r--include/rdma/ib_user_verbs.h41
4 files changed, 143 insertions, 0 deletions
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
index 3207239819ce..89c798eb5749 100644
--- a/drivers/infiniband/core/uverbs.h
+++ b/drivers/infiniband/core/uverbs.h
@@ -183,6 +183,7 @@ IB_UVERBS_DECLARE_CMD(poll_cq);
183IB_UVERBS_DECLARE_CMD(req_notify_cq); 183IB_UVERBS_DECLARE_CMD(req_notify_cq);
184IB_UVERBS_DECLARE_CMD(destroy_cq); 184IB_UVERBS_DECLARE_CMD(destroy_cq);
185IB_UVERBS_DECLARE_CMD(create_qp); 185IB_UVERBS_DECLARE_CMD(create_qp);
186IB_UVERBS_DECLARE_CMD(query_qp);
186IB_UVERBS_DECLARE_CMD(modify_qp); 187IB_UVERBS_DECLARE_CMD(modify_qp);
187IB_UVERBS_DECLARE_CMD(destroy_qp); 188IB_UVERBS_DECLARE_CMD(destroy_qp);
188IB_UVERBS_DECLARE_CMD(post_send); 189IB_UVERBS_DECLARE_CMD(post_send);
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 398c125d908c..4cbef8c06634 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -996,6 +996,106 @@ err_up:
996 return ret; 996 return ret;
997} 997}
998 998
999ssize_t ib_uverbs_query_qp(struct ib_uverbs_file *file,
1000 const char __user *buf, int in_len,
1001 int out_len)
1002{
1003 struct ib_uverbs_query_qp cmd;
1004 struct ib_uverbs_query_qp_resp resp;
1005 struct ib_qp *qp;
1006 struct ib_qp_attr *attr;
1007 struct ib_qp_init_attr *init_attr;
1008 int ret;
1009
1010 if (copy_from_user(&cmd, buf, sizeof cmd))
1011 return -EFAULT;
1012
1013 attr = kmalloc(sizeof *attr, GFP_KERNEL);
1014 init_attr = kmalloc(sizeof *init_attr, GFP_KERNEL);
1015 if (!attr || !init_attr) {
1016 ret = -ENOMEM;
1017 goto out;
1018 }
1019
1020 mutex_lock(&ib_uverbs_idr_mutex);
1021
1022 qp = idr_find(&ib_uverbs_qp_idr, cmd.qp_handle);
1023 if (qp && qp->uobject->context == file->ucontext)
1024 ret = ib_query_qp(qp, attr, cmd.attr_mask, init_attr);
1025 else
1026 ret = -EINVAL;
1027
1028 mutex_unlock(&ib_uverbs_idr_mutex);
1029
1030 if (ret)
1031 goto out;
1032
1033 memset(&resp, 0, sizeof resp);
1034
1035 resp.qp_state = attr->qp_state;
1036 resp.cur_qp_state = attr->cur_qp_state;
1037 resp.path_mtu = attr->path_mtu;
1038 resp.path_mig_state = attr->path_mig_state;
1039 resp.qkey = attr->qkey;
1040 resp.rq_psn = attr->rq_psn;
1041 resp.sq_psn = attr->sq_psn;
1042 resp.dest_qp_num = attr->dest_qp_num;
1043 resp.qp_access_flags = attr->qp_access_flags;
1044 resp.pkey_index = attr->pkey_index;
1045 resp.alt_pkey_index = attr->alt_pkey_index;
1046 resp.en_sqd_async_notify = attr->en_sqd_async_notify;
1047 resp.max_rd_atomic = attr->max_rd_atomic;
1048 resp.max_dest_rd_atomic = attr->max_dest_rd_atomic;
1049 resp.min_rnr_timer = attr->min_rnr_timer;
1050 resp.port_num = attr->port_num;
1051 resp.timeout = attr->timeout;
1052 resp.retry_cnt = attr->retry_cnt;
1053 resp.rnr_retry = attr->rnr_retry;
1054 resp.alt_port_num = attr->alt_port_num;
1055 resp.alt_timeout = attr->alt_timeout;
1056
1057 memcpy(resp.dest.dgid, attr->ah_attr.grh.dgid.raw, 16);
1058 resp.dest.flow_label = attr->ah_attr.grh.flow_label;
1059 resp.dest.sgid_index = attr->ah_attr.grh.sgid_index;
1060 resp.dest.hop_limit = attr->ah_attr.grh.hop_limit;
1061 resp.dest.traffic_class = attr->ah_attr.grh.traffic_class;
1062 resp.dest.dlid = attr->ah_attr.dlid;
1063 resp.dest.sl = attr->ah_attr.sl;
1064 resp.dest.src_path_bits = attr->ah_attr.src_path_bits;
1065 resp.dest.static_rate = attr->ah_attr.static_rate;
1066 resp.dest.is_global = !!(attr->ah_attr.ah_flags & IB_AH_GRH);
1067 resp.dest.port_num = attr->ah_attr.port_num;
1068
1069 memcpy(resp.alt_dest.dgid, attr->alt_ah_attr.grh.dgid.raw, 16);
1070 resp.alt_dest.flow_label = attr->alt_ah_attr.grh.flow_label;
1071 resp.alt_dest.sgid_index = attr->alt_ah_attr.grh.sgid_index;
1072 resp.alt_dest.hop_limit = attr->alt_ah_attr.grh.hop_limit;
1073 resp.alt_dest.traffic_class = attr->alt_ah_attr.grh.traffic_class;
1074 resp.alt_dest.dlid = attr->alt_ah_attr.dlid;
1075 resp.alt_dest.sl = attr->alt_ah_attr.sl;
1076 resp.alt_dest.src_path_bits = attr->alt_ah_attr.src_path_bits;
1077 resp.alt_dest.static_rate = attr->alt_ah_attr.static_rate;
1078 resp.alt_dest.is_global = !!(attr->alt_ah_attr.ah_flags & IB_AH_GRH);
1079 resp.alt_dest.port_num = attr->alt_ah_attr.port_num;
1080
1081 resp.max_send_wr = init_attr->cap.max_send_wr;
1082 resp.max_recv_wr = init_attr->cap.max_recv_wr;
1083 resp.max_send_sge = init_attr->cap.max_send_sge;
1084 resp.max_recv_sge = init_attr->cap.max_recv_sge;
1085 resp.max_inline_data = init_attr->cap.max_inline_data;
1086 resp.sq_sig_all = !!init_attr->sq_sig_type;
1087
1088 if (copy_to_user((void __user *) (unsigned long) cmd.response,
1089 &resp, sizeof resp))
1090 ret = -EFAULT;
1091
1092out:
1093 kfree(attr);
1094 kfree(init_attr);
1095
1096 return ret ? ret : in_len;
1097}
1098
999ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file, 1099ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file,
1000 const char __user *buf, int in_len, 1100 const char __user *buf, int in_len,
1001 int out_len) 1101 int out_len)
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index 335b6938a656..91e4750fa319 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -96,6 +96,7 @@ static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
96 [IB_USER_VERBS_CMD_REQ_NOTIFY_CQ] = ib_uverbs_req_notify_cq, 96 [IB_USER_VERBS_CMD_REQ_NOTIFY_CQ] = ib_uverbs_req_notify_cq,
97 [IB_USER_VERBS_CMD_DESTROY_CQ] = ib_uverbs_destroy_cq, 97 [IB_USER_VERBS_CMD_DESTROY_CQ] = ib_uverbs_destroy_cq,
98 [IB_USER_VERBS_CMD_CREATE_QP] = ib_uverbs_create_qp, 98 [IB_USER_VERBS_CMD_CREATE_QP] = ib_uverbs_create_qp,
99 [IB_USER_VERBS_CMD_QUERY_QP] = ib_uverbs_query_qp,
99 [IB_USER_VERBS_CMD_MODIFY_QP] = ib_uverbs_modify_qp, 100 [IB_USER_VERBS_CMD_MODIFY_QP] = ib_uverbs_modify_qp,
100 [IB_USER_VERBS_CMD_DESTROY_QP] = ib_uverbs_destroy_qp, 101 [IB_USER_VERBS_CMD_DESTROY_QP] = ib_uverbs_destroy_qp,
101 [IB_USER_VERBS_CMD_POST_SEND] = ib_uverbs_post_send, 102 [IB_USER_VERBS_CMD_POST_SEND] = ib_uverbs_post_send,
diff --git a/include/rdma/ib_user_verbs.h b/include/rdma/ib_user_verbs.h
index fb94c08169ce..58662c34a3de 100644
--- a/include/rdma/ib_user_verbs.h
+++ b/include/rdma/ib_user_verbs.h
@@ -370,6 +370,47 @@ struct ib_uverbs_qp_dest {
370 __u8 port_num; 370 __u8 port_num;
371}; 371};
372 372
373struct ib_uverbs_query_qp {
374 __u64 response;
375 __u32 qp_handle;
376 __u32 attr_mask;
377 __u64 driver_data[0];
378};
379
380struct ib_uverbs_query_qp_resp {
381 struct ib_uverbs_qp_dest dest;
382 struct ib_uverbs_qp_dest alt_dest;
383 __u32 max_send_wr;
384 __u32 max_recv_wr;
385 __u32 max_send_sge;
386 __u32 max_recv_sge;
387 __u32 max_inline_data;
388 __u32 qkey;
389 __u32 rq_psn;
390 __u32 sq_psn;
391 __u32 dest_qp_num;
392 __u32 qp_access_flags;
393 __u16 pkey_index;
394 __u16 alt_pkey_index;
395 __u8 qp_state;
396 __u8 cur_qp_state;
397 __u8 path_mtu;
398 __u8 path_mig_state;
399 __u8 en_sqd_async_notify;
400 __u8 max_rd_atomic;
401 __u8 max_dest_rd_atomic;
402 __u8 min_rnr_timer;
403 __u8 port_num;
404 __u8 timeout;
405 __u8 retry_cnt;
406 __u8 rnr_retry;
407 __u8 alt_port_num;
408 __u8 alt_timeout;
409 __u8 sq_sig_all;
410 __u8 reserved[5];
411 __u64 driver_data[0];
412};
413
373struct ib_uverbs_modify_qp { 414struct ib_uverbs_modify_qp {
374 struct ib_uverbs_qp_dest dest; 415 struct ib_uverbs_qp_dest dest;
375 struct ib_uverbs_qp_dest alt_dest; 416 struct ib_uverbs_qp_dest alt_dest;