]> git.openfabrics.org - ~shefty/libibverbs.git/commitdiff
Handle kernel uverbs ABI version 4
authorJack Morgenstein <jackm@mellanox.co.il>
Wed, 9 Nov 2005 18:25:08 +0000 (18:25 +0000)
committerRoland Dreier <rolandd@cisco.com>
Thu, 9 Nov 2006 19:35:58 +0000 (11:35 -0800)
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>
ChangeLog
include/infiniband/kern-abi.h
src/cmd.c

index b38c257641e748dead5915799fd8994ae3757cd8..cce5e230baac34e7beba216682aad7213a0567fe 100644 (file)
--- 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 +
index 1bfbd796ce72f9452c38cedfb65ae9667f631e61..32c3e29e410ab9d1a47188508ec470aed3500a16 100644 (file)
@@ -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 */
index ce7ffef3095b3b222ae07b87e4f59e7c166ff1ab..843465094bf41af5ca3146414600dcd23fc0559d 100644 (file)
--- 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;
 }