aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;