From 487a52078fe1ba322273a6b893d31e0caaa69a57 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 16 Oct 2007 14:59:21 -0700 Subject: [PATCH] librdmacm/cma: provide sanity checks for max outstanding rdma ops Ensure that the responder_resources and initiator_depth values provided by the user are supported by the local hardware. This traps errors sooner during connection establishment (when calling rdma_connect), rather than waiting until the modify QP fails (after calling rdma_accept). Signed-off-by: Sean Hefty --- src/cma.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/cma.c b/src/cma.c index c0ae114e..00ea394d 100644 --- a/src/cma.c +++ b/src/cma.c @@ -116,6 +116,8 @@ struct cma_device { struct ibv_context *verbs; uint64_t guid; int port_cnt; + uint8_t max_initiator_depth; + uint8_t max_responder_resources; }; struct cma_id_private { @@ -246,6 +248,8 @@ static int ucma_init(void) } cma_dev->port_cnt = attr.phys_port_cnt; + cma_dev->max_initiator_depth = (uint8_t) attr.max_qp_init_rd_atom; + cma_dev->max_responder_resources = (uint8_t) attr.max_qp_rd_atom; } out: pthread_mutex_unlock(&mut); @@ -810,6 +814,21 @@ void rdma_destroy_qp(struct rdma_cm_id *id) ibv_destroy_qp(id->qp); } +static int ucma_valid_param(struct cma_id_private *id_priv, + struct rdma_conn_param *conn_param) +{ + if (id_priv->id.ps != RDMA_PS_TCP) + return 0; + + if ((conn_param->responder_resources > + id_priv->cma_dev->max_responder_resources) || + (conn_param->initiator_depth > + id_priv->cma_dev->max_initiator_depth)) + return -EINVAL; + + return 0; +} + static void ucma_copy_conn_param_to_kern(struct ucma_abi_conn_param *dst, struct rdma_conn_param *src, uint32_t qp_num, uint8_t srq) @@ -837,8 +856,12 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param) void *msg; int ret, size; - CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_CONNECT, size); id_priv = container_of(id, struct cma_id_private, id); + ret = ucma_valid_param(id_priv, conn_param); + if (ret) + return ret; + + CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_CONNECT, size); cmd->id = id_priv->handle; if (id->qp) ucma_copy_conn_param_to_kern(&cmd->conn_param, conn_param, @@ -882,6 +905,11 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param) void *msg; int ret, size; + id_priv = container_of(id, struct cma_id_private, id); + ret = ucma_valid_param(id_priv, conn_param); + if (ret) + return ret; + if (!ucma_is_ud_ps(id->ps)) { ret = ucma_modify_qp_rtr(id); if (ret) @@ -889,7 +917,6 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param) } CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_ACCEPT, size); - id_priv = container_of(id, struct cma_id_private, id); cmd->id = id_priv->handle; cmd->uid = (uintptr_t) id_priv; if (id->qp) -- 2.46.0