pthread_mutex_t mut;
uint32_t handle;
struct cma_multicast *mc_list;
+ uint8_t initiator_depth;
+ uint8_t responder_resources;
};
struct cma_multicast {
return 0;
}
-static int ucma_modify_qp_rtr(struct rdma_cm_id *id,
- struct rdma_conn_param *conn_param)
+static int ucma_modify_qp_rtr(struct rdma_cm_id *id, uint8_t resp_res)
{
struct ibv_qp_attr qp_attr;
int qp_attr_mask, ret;
if (ret)
return ret;
- if (conn_param)
- qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
+ if (resp_res != RDMA_MAX_RESP_RES)
+ qp_attr.max_dest_rd_atomic = resp_res;
return ibv_modify_qp(id->qp, &qp_attr, qp_attr_mask);
}
-static int ucma_modify_qp_rts(struct rdma_cm_id *id,
- struct rdma_conn_param *conn_param)
+static int ucma_modify_qp_rts(struct rdma_cm_id *id, uint8_t init_depth)
{
struct ibv_qp_attr qp_attr;
int qp_attr_mask, ret;
if (ret)
return ret;
- if (conn_param)
- qp_attr.max_rd_atomic = conn_param->initiator_depth;
+ if (init_depth != RDMA_MAX_INIT_DEPTH)
+ qp_attr.max_rd_atomic = init_depth;
return ibv_modify_qp(id->qp, &qp_attr, qp_attr_mask);
}
}
static int ucma_valid_param(struct cma_id_private *id_priv,
- struct rdma_conn_param *conn_param)
+ struct rdma_conn_param *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))
+ if ((param->responder_resources != RDMA_MAX_RESP_RES) &&
+ (param->responder_resources > id_priv->cma_dev->max_responder_resources))
+ return ERR(EINVAL);
+
+ if ((param->initiator_depth != RDMA_MAX_INIT_DEPTH) &&
+ (param->initiator_depth > id_priv->cma_dev->max_initiator_depth))
return ERR(EINVAL);
return 0;
}
-static void ucma_copy_conn_param_to_kern(struct ucma_abi_conn_param *dst,
+static void ucma_copy_conn_param_to_kern(struct cma_id_private *id_priv,
+ struct ucma_abi_conn_param *dst,
struct rdma_conn_param *src,
uint32_t qp_num, uint8_t srq)
{
dst->qp_num = qp_num;
dst->srq = srq;
- dst->responder_resources = src->responder_resources;
- dst->initiator_depth = src->initiator_depth;
+ dst->responder_resources = id_priv->responder_resources;
+ dst->initiator_depth = id_priv->initiator_depth;
dst->flow_control = src->flow_control;
dst->retry_count = src->retry_count;
dst->rnr_retry_count = src->rnr_retry_count;
if (ret)
return ret;
+ if (conn_param->initiator_depth != RDMA_MAX_INIT_DEPTH)
+ id_priv->initiator_depth = conn_param->initiator_depth;
+ else
+ id_priv->initiator_depth = id_priv->cma_dev->max_initiator_depth;
+ if (conn_param->responder_resources != RDMA_MAX_RESP_RES)
+ id_priv->responder_resources = conn_param->responder_resources;
+ else
+ id_priv->responder_resources = id_priv->cma_dev->max_responder_resources;
+
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,
- id->qp->qp_num,
+ ucma_copy_conn_param_to_kern(id_priv, &cmd->conn_param,
+ conn_param, id->qp->qp_num,
(id->qp->srq != NULL));
else
- ucma_copy_conn_param_to_kern(&cmd->conn_param, conn_param,
- conn_param->qp_num,
+ ucma_copy_conn_param_to_kern(id_priv, &cmd->conn_param,
+ conn_param, conn_param->qp_num,
conn_param->srq);
ret = write(id->channel->fd, msg, size);
if (ret)
return ret;
+ if (conn_param->initiator_depth == RDMA_MAX_INIT_DEPTH) {
+ id_priv->initiator_depth = min(id_priv->initiator_depth,
+ id_priv->cma_dev->max_initiator_depth);
+ } else {
+ id_priv->initiator_depth = conn_param->initiator_depth;
+ }
+ if (conn_param->responder_resources == RDMA_MAX_RESP_RES) {
+ id_priv->responder_resources = min(id_priv->responder_resources,
+ id_priv->cma_dev->max_responder_resources);
+ } else {
+ id_priv->responder_resources = conn_param->responder_resources;
+ }
+
if (!ucma_is_ud_ps(id->ps)) {
- ret = ucma_modify_qp_rtr(id, conn_param);
+ ret = ucma_modify_qp_rtr(id, id_priv->responder_resources);
if (ret)
return ret;
- ret = ucma_modify_qp_rts(id, conn_param);
+ ret = ucma_modify_qp_rts(id, id_priv->initiator_depth);
if (ret)
return ret;
}
cmd->id = id_priv->handle;
cmd->uid = (uintptr_t) id_priv;
if (id->qp)
- ucma_copy_conn_param_to_kern(&cmd->conn_param, conn_param,
- id->qp->qp_num,
+ ucma_copy_conn_param_to_kern(id_priv, &cmd->conn_param,
+ conn_param, id->qp->qp_num,
(id->qp->srq != NULL));
else
- ucma_copy_conn_param_to_kern(&cmd->conn_param, conn_param,
- conn_param->qp_num,
+ ucma_copy_conn_param_to_kern(id_priv, &cmd->conn_param,
+ conn_param, conn_param->qp_num,
conn_param->srq);
ret = write(id->channel->fd, msg, size);
evt->event.listen_id = &evt->id_priv->id;
evt->event.id = &id_priv->id;
id_priv->handle = handle;
+ id_priv->initiator_depth = evt->event.param.conn.initiator_depth;
+ id_priv->responder_resources = evt->event.param.conn.responder_resources;
if (evt->id_priv->sync) {
ret = rdma_migrate_id(&id_priv->id, NULL);
void *msg;
int ret, size;
- ret = ucma_modify_qp_rtr(&id_priv->id, NULL);
+ ret = ucma_modify_qp_rtr(&id_priv->id, RDMA_MAX_RESP_RES);
if (ret)
goto err;
- ret = ucma_modify_qp_rts(&id_priv->id, NULL);
+ ret = ucma_modify_qp_rts(&id_priv->id, RDMA_MAX_INIT_DEPTH);
if (ret)
goto err;