[ofa-general] [PATCH 2 of 5] libmlx4: limit qp resources accepted for create_qp per query_device values

Jack Morgenstein jackm at dev.mellanox.co.il
Wed Oct 24 09:53:01 PDT 2007


Limit qp resources accepted for ibv_create_qp()
to the limits reported in ib_query_device().
Make sure that the limits returned to the caller following
qp creation also lie within the reported device limits.
    
Signed-off-by: Jack Morgenstein <jackm at dev.mellanox.co.il>

diff --git a/src/qp.c b/src/qp.c
index da5d2ed..61f1c9b 100644
--- a/src/qp.c
+++ b/src/qp.c
@@ -607,6 +607,7 @@ void mlx4_set_sq_sizes(struct mlx4_qp *qp, struct ibv_qp_cap *cap,
 		       enum ibv_qp_type type)
 {
 	int wqe_size;
+	struct mlx4_context *ctx = to_mctx(qp->ibv_qp.context);
 
 	wqe_size = (1 << qp->sq.wqe_shift) - sizeof (struct mlx4_wqe_ctrl_seg);
 	switch (type) {
@@ -624,8 +625,9 @@ void mlx4_set_sq_sizes(struct mlx4_qp *qp, struct ibv_qp_cap *cap,
 	}
 
 	qp->sq.max_gs	     = wqe_size / sizeof (struct mlx4_wqe_data_seg);
-	cap->max_send_sge    = qp->sq.max_gs;
-	qp->sq.max_post	     = qp->sq.wqe_cnt - qp->sq_spare_wqes;
+	cap->max_send_sge    = min(ctx->max_sge, qp->sq.max_gs);
+	qp->sq.max_post	     = min(ctx->max_qp_wr,
+				   qp->sq.wqe_cnt - qp->sq_spare_wqes);
 	cap->max_send_wr     = qp->sq.max_post;
 
 	/*
diff --git a/src/verbs.c b/src/verbs.c
index ff89dd0..059b534 100644
--- a/src/verbs.c
+++ b/src/verbs.c
@@ -359,12 +359,14 @@ struct ibv_qp *mlx4_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr)
 	struct ibv_create_qp_resp resp;
 	struct mlx4_qp		 *qp;
 	int			  ret;
+	struct mlx4_context	 *context = to_mctx(pd->context);
+
 
 	/* Sanity check QP size before proceeding */
-	if (attr->cap.max_send_wr     > 65536 ||
-	    attr->cap.max_recv_wr     > 65536 ||
-	    attr->cap.max_send_sge    > 64    ||
-	    attr->cap.max_recv_sge    > 64    ||
+	if (attr->cap.max_send_wr     > context->max_qp_wr ||
+	    attr->cap.max_recv_wr     > context->max_qp_wr ||
+	    attr->cap.max_send_sge    > context->max_sge   ||
+	    attr->cap.max_recv_sge    > context->max_sge   ||
 	    attr->cap.max_inline_data > 1024)
 		return NULL;
 
@@ -430,8 +432,14 @@ struct ibv_qp *mlx4_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr)
 	if (ret)
 		goto err_destroy;
 
-	qp->rq.wqe_cnt = qp->rq.max_post = attr->cap.max_recv_wr;
+	qp->rq.wqe_cnt = attr->cap.max_recv_wr;
 	qp->rq.max_gs  = attr->cap.max_recv_sge;
+
+	/* adjust rq maxima to not exceed reported device maxima */
+	attr->cap.max_recv_wr = min(context->max_qp_wr, attr->cap.max_recv_wr);
+	attr->cap.max_recv_sge = min(context->max_sge, attr->cap.max_recv_sge);
+
+	qp->rq.max_post = attr->cap.max_recv_wr;
 	mlx4_set_sq_sizes(qp, &attr->cap, attr->qp_type);
 
 	qp->doorbell_qpn    = htonl(qp->ibv_qp.qp_num << 8);



More information about the general mailing list