[openib-general] [PATCH] libmthca: fix wqe post (was Re: strange mem-free bug)

Michael S. Tsirkin mst at mellanox.co.il
Tue Sep 13 08:31:55 PDT 2005


Quoting r. Roland Dreier <rolandd at cisco.com>:
> Subject: strange mem-free bug (was: [openib-general] completion Q overflow error/panic)
> 
> While looking at Viswa's example, I've found what seems to be a
> problem using lots of QPs on mem-free HCAs.

Hi, Roland!
This seems to be a bug in libmthca. Patch below.

We probably need a similiar fix for kernel mthca - let me know if
you plan to work on that, otherwise I'll look into it tomorrow.
And its probably something we want fixed for 2.6.14, right?
Let me know.

With regard to the test code that you posted - I also have some small
comments. If you plan to use it in the future, you can stick it
in svn somewhere and I'll send patches.

---

Fix posting of the first work request for memfree hardware.
Simplify code for tavor mode hardware.

Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>

Index: userspace/libmthca/src/qp.c
===================================================================
--- userspace.orig/libmthca/src/qp.c	2005-09-13 17:17:58.000000000 +0300
+++ userspace/libmthca/src/qp.c	2005-09-13 17:26:23.000000000 +0300
@@ -259,15 +259,13 @@ int mthca_tavor_post_send(struct ibv_qp 
 			goto out;
 		}
 
-		if (prev_wqe) {
-			((struct mthca_next_seg *) prev_wqe)->nda_op =
-				htonl(((ind << qp->sq.wqe_shift) +
-				       qp->send_wqe_offset) |
-				      mthca_opcode[wr->opcode]);
+		((struct mthca_next_seg *) prev_wqe)->nda_op =
+			htonl(((ind << qp->sq.wqe_shift) +
+			       qp->send_wqe_offset) |
+			      mthca_opcode[wr->opcode]);
 
-			((struct mthca_next_seg *) prev_wqe)->ee_nds =
-				htonl((size0 ? 0 : MTHCA_NEXT_DBD) | size);
-		}
+		((struct mthca_next_seg *) prev_wqe)->ee_nds =
+			htonl((size0 ? 0 : MTHCA_NEXT_DBD) | size);
 
 		if (!size0) {
 			size0 = size;
@@ -353,12 +351,10 @@ int mthca_tavor_post_recv(struct ibv_qp 
 
 		qp->wrid[ind] = wr->wr_id;
 
-		if (prev_wqe) {
-			((struct mthca_next_seg *) prev_wqe)->nda_op =
-				htonl((ind << qp->rq.wqe_shift) | 1);
-			((struct mthca_next_seg *) prev_wqe)->ee_nds =
-				htonl(MTHCA_NEXT_DBD | size);
-		}
+		((struct mthca_next_seg *) prev_wqe)->nda_op =
+			htonl((ind << qp->rq.wqe_shift) | 1);
+		((struct mthca_next_seg *) prev_wqe)->ee_nds =
+			htonl(MTHCA_NEXT_DBD | size);
 
 		if (!size0)
 			size0 = size;
@@ -562,15 +558,13 @@ int mthca_arbel_post_send(struct ibv_qp 
 			goto out;
 		}
 
-		if (prev_wqe) {
-			((struct mthca_next_seg *) prev_wqe)->nda_op =
-				htonl(((ind << qp->sq.wqe_shift) +
-				       qp->send_wqe_offset) |
-				      mthca_opcode[wr->opcode]);
-			mb();
-			((struct mthca_next_seg *) prev_wqe)->ee_nds =
-				htonl(MTHCA_NEXT_DBD | size);
-		}
+		((struct mthca_next_seg *) prev_wqe)->nda_op =
+			htonl(((ind << qp->sq.wqe_shift) +
+			       qp->send_wqe_offset) |
+			      mthca_opcode[wr->opcode]);
+		mb();
+		((struct mthca_next_seg *) prev_wqe)->ee_nds =
+			htonl(MTHCA_NEXT_DBD | size);
 
 		if (!size0) {
 			size0 = size;
@@ -767,6 +761,8 @@ int mthca_alloc_qp_buf(struct ibv_pd *pd
 		}
 	}
 
+	qp->sq.last = get_send_wqe(qp, qp->sq.max - 1);
+	qp->rq.last = get_recv_wqe(qp, qp->sq.max - 1);
 	return 0;
 }
 
Index: userspace/libmthca/src/srq.c
===================================================================
--- userspace.orig/libmthca/src/srq.c	2005-09-13 17:25:41.000000000 +0300
+++ userspace/libmthca/src/srq.c	2005-09-13 17:25:51.000000000 +0300
@@ -142,13 +142,11 @@ int mthca_tavor_post_srq_recv(struct ibv
 			((struct mthca_data_seg *) wqe)->addr = 0;
 		}
 
-		if (prev_wqe) {
-			((struct mthca_next_seg *) prev_wqe)->nda_op =
-				htonl((ind << srq->wqe_shift) | 1);
-			mb();
-			((struct mthca_next_seg *) prev_wqe)->ee_nds =
-				htonl(MTHCA_NEXT_DBD);
-		}
+		((struct mthca_next_seg *) prev_wqe)->nda_op =
+			htonl((ind << srq->wqe_shift) | 1);
+		mb();
+		((struct mthca_next_seg *) prev_wqe)->ee_nds =
+			htonl(MTHCA_NEXT_DBD);
 
 		srq->wrid[ind]  = wr->wr_id;
 		srq->first_free = next_ind;
@@ -294,6 +292,7 @@ int mthca_alloc_srq_buf(struct ibv_pd *p
 
 	srq->first_free = 0;
 	srq->last_free  = srq->max - 1;
+	srq->last = get_wqe(srq, srq->max - 1);
 
 	return 0;
 }
Index: userspace/libmthca/src/verbs.c
===================================================================
--- userspace.orig/libmthca/src/verbs.c	2005-08-23 14:03:12.000000000 +0300
+++ userspace/libmthca/src/verbs.c	2005-09-13 17:25:14.000000000 +0300
@@ -306,7 +306,6 @@ struct ibv_srq *mthca_create_srq(struct 
 
 	srq->max     = align_queue_size(pd->context, attr->attr.max_wr, 1);
 	srq->max_gs  = attr->attr.max_sge;
-	srq->last    = NULL;
 	srq->counter = 0;
 
 	if (mthca_alloc_srq_buf(pd, &attr->attr, srq))
@@ -413,14 +412,12 @@ struct ibv_qp *mthca_create_qp(struct ib
 	qp->sq.last_comp = qp->sq.max - 1;
 	qp->sq.head    	 = 0;
 	qp->sq.tail    	 = 0;
-	qp->sq.last      = NULL;
 
 	qp->rq.max       = align_queue_size(pd->context, attr->cap.max_recv_wr, 0);
 	qp->rq.next_ind	 = 0;
 	qp->rq.last_comp = qp->rq.max - 1;
 	qp->rq.head    	 = 0;
 	qp->rq.tail    	 = 0;
-	qp->rq.last      = NULL;
 
 	if (mthca_alloc_qp_buf(pd, &attr->cap, qp))
 		goto err;


-- 
MST



More information about the general mailing list