[openib-general] [PATCH] (repost) no qp lock on poll, separate sq/rq locks

Roland Dreier roland at topspin.com
Fri Feb 25 08:59:49 PST 2005


    Roland> I think the solution is to keep track of the last
    Roland> completed index too, and then we can figure out how many
    Roland> WQEs a completion is for.

Something like this should do the trick I think...

--- hw/mthca/mthca_provider.h	(revision 1915)
+++ hw/mthca/mthca_provider.h	(working copy)
@@ -169,6 +169,7 @@ struct mthca_wq {
 	spinlock_t lock;
 	int        max;
 	unsigned   next_ind;
+	unsigned   last_comp;
 	unsigned   head;
 	unsigned   tail;
 	void      *last;
--- hw/mthca/mthca_cq.c	(revision 1915)
+++ hw/mthca/mthca_cq.c	(working copy)
@@ -453,7 +453,12 @@ static inline int mthca_poll_one(struct 
 		entry->wr_id = (*cur_qp)->wrid[wqe_index];
 	}
 
-	++wq->tail;
+	if (wq->last_comp < wqe_index)
+		wq->tail += wqe_index - wq->last_comp;
+	else
+		wq->tail += wqe_index + wq->max - wq->last_comp;
+
+	wq->last_comp = wqe_index;
 
 	if (0)
 		mthca_dbg(dev, "%s completion for QP %06x, index %d (nr %d)\n",
--- hw/mthca/mthca_qp.c	(revision 1915)
+++ hw/mthca/mthca_qp.c	(working copy)
@@ -1082,6 +1082,7 @@ static void mthca_wq_init(struct mthca_w
 {
 	spin_lock_init(&wq->lock);
 	wq->next_ind  = 0;
+	wq->last_comp = wq->max - 1;
 	wq->head      = 0;
 	wq->tail      = 0;
 	wq->last      = NULL;



More information about the general mailing list