aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@mellanox.co.il>2005-11-09 18:25:08 +0000
committerRoland Dreier <rolandd@cisco.com>2006-11-09 11:35:58 -0800
commit36e717cf0f92f70b8fe9f851cd6e7f2d57e88d03 (patch)
treecfcd8c1e93a94c547eedd690529e27f98c1b4c9f
parent1497ebe17877c350166fc61d87a1b3d8458dfcef (diff)
downloadlibibverbs-36e717cf0f92f70b8fe9f851cd6e7f2d57e88d03.tar.gz
Handle kernel uverbs ABI version 4
Update libibverbs and libmthca to handle new kernel ABI 4, which has the kernel compute exact capabilities for QPs. Signed-off-by: Jack Morgenstein <jackm@mellanox.co.il> Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--ChangeLog8
-rw-r--r--include/infiniband/kern-abi.h27
-rw-r--r--src/cmd.c60
3 files changed, 85 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index b38c257..cce5e23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-08 Roland Dreier <roland@cisco.com>
+
+ * src/cmd.c (ibv_cmd_create_qp): Add handling for new create QP
+ interface, which has the kernel return QP capabilities.
+
+ * src/cmd.c (ibv_cmd_modify_srq): Split off handling of modify SRQ
+ for ABI versions 3 and older, which passed max_sge as part of command.
+
2005-10-30 Roland Dreier <roland@cisco.com>
* examples/srq_pingpong.c (pp_init_ctx): Create CQ with rx_depth +
diff --git a/include/infiniband/kern-abi.h b/include/infiniband/kern-abi.h
index 1bfbd79..32c3e29 100644
--- a/include/infiniband/kern-abi.h
+++ b/include/infiniband/kern-abi.h
@@ -48,7 +48,7 @@
* The minimum and maximum kernel ABI that we can handle.
*/
#define IB_USER_VERBS_MIN_ABI_VERSION 1
-#define IB_USER_VERBS_MAX_ABI_VERSION 3
+#define IB_USER_VERBS_MAX_ABI_VERSION 4
enum {
IB_USER_VERBS_CMD_GET_CONTEXT,
@@ -382,6 +382,11 @@ struct ibv_create_qp {
struct ibv_create_qp_resp {
__u32 qp_handle;
__u32 qpn;
+ __u32 max_send_wr;
+ __u32 max_recv_wr;
+ __u32 max_send_sge;
+ __u32 max_recv_sge;
+ __u32 max_inline_data;
};
struct ibv_qp_dest {
@@ -615,9 +620,7 @@ struct ibv_modify_srq {
__u32 srq_handle;
__u32 attr_mask;
__u32 max_wr;
- __u32 max_sge;
__u32 srq_limit;
- __u32 reserved;
__u64 driver_data[0];
};
@@ -726,4 +729,22 @@ struct ibv_create_cq_v2 {
__u64 driver_data[0];
};
+struct ibv_modify_srq_v3 {
+ __u32 command;
+ __u16 in_words;
+ __u16 out_words;
+ __u32 srq_handle;
+ __u32 attr_mask;
+ __u32 max_wr;
+ __u32 max_sge;
+ __u32 srq_limit;
+ __u32 reserved;
+ __u64 driver_data[0];
+};
+
+struct ibv_create_qp_resp_v3 {
+ __u32 qp_handle;
+ __u32 qpn;
+};
+
#endif /* KERN_ABI_H */
diff --git a/src/cmd.c b/src/cmd.c
index ce7ffef..8434650 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -420,19 +420,49 @@ int ibv_cmd_create_srq(struct ibv_pd *pd,
return 0;
}
+static int ibv_cmd_modify_srq_v3(struct ibv_srq *srq,
+ struct ibv_srq_attr *srq_attr,
+ enum ibv_srq_attr_mask srq_attr_mask,
+ struct ibv_modify_srq *new_cmd,
+ size_t new_cmd_size)
+{
+ struct ibv_modify_srq_v3 *cmd;
+ size_t cmd_size;
+
+ cmd_size = sizeof *cmd + new_cmd_size - sizeof *new_cmd;
+ cmd = alloca(cmd_size);
+ memcpy(cmd->driver_data, new_cmd->driver_data, new_cmd_size - sizeof *new_cmd);
+
+ IBV_INIT_CMD(cmd, cmd_size, MODIFY_SRQ);
+
+ cmd->srq_handle = srq->handle;
+ cmd->attr_mask = srq_attr_mask;
+ cmd->max_wr = srq_attr->max_wr;
+ cmd->srq_limit = srq_attr->srq_limit;
+ cmd->max_sge = 0;
+ cmd->reserved = 0;
+
+ if (write(srq->context->cmd_fd, cmd, cmd_size) != cmd_size)
+ return errno;
+
+ return 0;
+}
+
int ibv_cmd_modify_srq(struct ibv_srq *srq,
struct ibv_srq_attr *srq_attr,
enum ibv_srq_attr_mask srq_attr_mask,
struct ibv_modify_srq *cmd, size_t cmd_size)
{
+ if (abi_ver == 3)
+ return ibv_cmd_modify_srq_v3(srq, srq_attr, srq_attr_mask,
+ cmd, cmd_size);
+
IBV_INIT_CMD(cmd, cmd_size, MODIFY_SRQ);
cmd->srq_handle = srq->handle;
cmd->attr_mask = srq_attr_mask;
cmd->max_wr = srq_attr->max_wr;
- cmd->max_sge = srq_attr->max_sge;
cmd->srq_limit = srq_attr->srq_limit;
- cmd->reserved = 0;
if (write(srq->context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
@@ -479,9 +509,15 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
struct ibv_qp *qp, struct ibv_qp_init_attr *attr,
struct ibv_create_qp *cmd, size_t cmd_size)
{
- struct ibv_create_qp_resp resp;
-
- IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_QP, &resp, sizeof resp);
+ union {
+ struct ibv_create_qp_resp resp;
+ struct ibv_create_qp_resp_v3 resp_v3;
+ } r;
+
+ if (abi_ver > 3)
+ IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_QP, &r.resp, sizeof r.resp);
+ else
+ IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_QP, &r.resp_v3, sizeof r.resp_v3);
cmd->user_handle = (uintptr_t) qp;
cmd->pd_handle = pd->handle;
cmd->send_cq_handle = attr->send_cq->handle;
@@ -499,8 +535,18 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
if (write(pd->context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
- qp->handle = resp.qp_handle;
- qp->qp_num = resp.qpn;
+ if (abi_ver > 3) {
+ qp->handle = r.resp.qp_handle;
+ qp->qp_num = r.resp.qpn;
+ attr->cap.max_recv_sge = r.resp.max_recv_sge;
+ attr->cap.max_send_sge = r.resp.max_send_sge;
+ attr->cap.max_recv_wr = r.resp.max_recv_wr;
+ attr->cap.max_send_wr = r.resp.max_send_wr;
+ attr->cap.max_inline_data = r.resp.max_inline_data;
+ } else {
+ qp->handle = r.resp_v3.qp_handle;
+ qp->qp_num = r.resp_v3.qpn;
+ }
return 0;
}