diff options
author | Yishai Hadas <yishaih@mellanox.com> | 2016-09-15 15:48:07 +0300 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-09-15 14:16:49 -0400 |
commit | 2ab51e84e49a30b8374dd508af080481c083b579 (patch) | |
tree | 842652a6324b7bcf959fab36f56e7d8826831118 | |
parent | 0672e793f09311c8d872bbf8db063270b5594de2 (diff) |
Extend create QP to get a Receive Work Queue indirection table
Extend create QP to get a Receive Work Queue indirection table,
this is needed to enable RSS on some set of Receive Work Queues.
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | include/infiniband/kern-abi.h | 6 | ||||
-rw-r--r-- | include/infiniband/verbs.h | 4 | ||||
-rw-r--r-- | src/cmd.c | 28 |
3 files changed, 32 insertions, 6 deletions
diff --git a/include/infiniband/kern-abi.h b/include/infiniband/kern-abi.h index 674045b..9f7964e 100644 --- a/include/infiniband/kern-abi.h +++ b/include/infiniband/kern-abi.h @@ -657,11 +657,17 @@ struct ibv_create_qp_resp { __u32 reserved; }; +enum ibv_create_qp_ex_kernel_mask { + IBV_CREATE_QP_EX_KERNEL_MASK_IND_TABLE = 1 << 0, +}; + struct ibv_create_qp_ex { struct ex_hdr hdr; struct ibv_create_qp_common base; __u32 comp_mask; __u32 create_flags; + __u32 ind_tbl_handle; + __u32 reserved1; }; struct ibv_create_qp_resp_ex { diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h index 491e254..284bac5 100644 --- a/include/infiniband/verbs.h +++ b/include/infiniband/verbs.h @@ -712,7 +712,8 @@ enum ibv_qp_init_attr_mask { IBV_QP_INIT_ATTR_XRCD = 1 << 1, IBV_QP_INIT_ATTR_CREATE_FLAGS = 1 << 2, IBV_QP_INIT_ATTR_MAX_TSO_HEADER = 1 << 3, - IBV_QP_INIT_ATTR_RESERVED = 1 << 4 + IBV_QP_INIT_ATTR_IND_TABLE = 1 << 4, + IBV_QP_INIT_ATTR_RESERVED = 1 << 5 }; enum ibv_qp_create_flags { @@ -734,6 +735,7 @@ struct ibv_qp_init_attr_ex { struct ibv_xrcd *xrcd; uint32_t create_flags; uint16_t max_tso_header; + struct ibv_rwq_ind_table *rwq_ind_tbl; }; enum ibv_qp_open_attr_mask { @@ -830,12 +830,22 @@ static int create_qp_ex_common(struct verbs_qp *qp, return EINVAL; cmd->pd_handle = qp_attr->pd->handle; - cmd->send_cq_handle = qp_attr->send_cq->handle; + if (qp_attr->comp_mask & IBV_QP_INIT_ATTR_IND_TABLE) { + if (cmd->max_recv_wr || cmd->max_recv_sge || + cmd->recv_cq_handle || qp_attr->srq) + return EINVAL; + + /* send_cq is optinal */ + if (qp_attr->cap.max_send_wr) + cmd->send_cq_handle = qp_attr->send_cq->handle; + } else { + cmd->send_cq_handle = qp_attr->send_cq->handle; - if (qp_attr->qp_type != IBV_QPT_XRC_SEND) { - cmd->recv_cq_handle = qp_attr->recv_cq->handle; - cmd->srq_handle = qp_attr->srq ? qp_attr->srq->handle : - 0; + if (qp_attr->qp_type != IBV_QPT_XRC_SEND) { + cmd->recv_cq_handle = qp_attr->recv_cq->handle; + cmd->srq_handle = qp_attr->srq ? qp_attr->srq->handle : + 0; + } } } @@ -933,6 +943,14 @@ int ibv_cmd_create_qp_ex2(struct ibv_context *context, cmd->create_flags = qp_attr->create_flags; } + if (qp_attr->comp_mask & IBV_QP_INIT_ATTR_IND_TABLE) { + if (cmd_core_size < offsetof(struct ibv_create_qp_ex, ind_tbl_handle) + + sizeof(cmd->ind_tbl_handle)) + return EINVAL; + cmd->ind_tbl_handle = qp_attr->rwq_ind_tbl->ind_tbl_handle; + cmd->comp_mask = IBV_CREATE_QP_EX_KERNEL_MASK_IND_TABLE; + } + err = write(context->cmd_fd, cmd, cmd_size); if (err != cmd_size) return errno; |