diff options
author | Jack Morgenstein <jackm@mellanox.co.il> | 2005-11-09 18:25:08 +0000 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-11-09 11:35:58 -0800 |
commit | 36e717cf0f92f70b8fe9f851cd6e7f2d57e88d03 (patch) | |
tree | cfcd8c1e93a94c547eedd690529e27f98c1b4c9f | |
parent | 1497ebe17877c350166fc61d87a1b3d8458dfcef (diff) | |
download | libibverbs-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-- | ChangeLog | 8 | ||||
-rw-r--r-- | include/infiniband/kern-abi.h | 27 | ||||
-rw-r--r-- | src/cmd.c | 60 |
3 files changed, 85 insertions, 10 deletions
@@ -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 */ @@ -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; } |