OK, here's an optimized version of the fix. With this, I see:

before
   5994       0       0    5994    176a drivers/infiniband/hw/mthca/mthca_cq.o
after
   5995       0       0    5995    176b drivers/infiniband/hw/mthca/mthca_cq.o

So the cost is minimal. Please consider for 2.6.17.

---

Memfree firmware is in rare cases reporting WQE index == base - 1
in receive completion with error instead of (rq size - 1); base is 0 in mthca.
Here is a patch to avoid kernel crash and report a correct WR id in this case.

Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>

Index: linux-2.6.16/drivers/infiniband/hw/mthca/mthca_cq.c
===================================================================
--- linux-2.6.16.orig/drivers/infiniband/hw/mthca/mthca_cq.c    2006-05-16 
12:33:05.000000000 +0300
+++ linux-2.6.16/drivers/infiniband/hw/mthca/mthca_cq.c 2006-06-13 
12:14:13.000000000 +0300
@@ -540,8 +540,17 @@ static inline int mthca_poll_one(struct 
                entry->wr_id = srq->wrid[wqe_index];
                mthca_free_srq_wqe(srq, wqe);
        } else {
+               s32 wqe;
                wq = &(*cur_qp)->rq;
-               wqe_index = be32_to_cpu(cqe->wqe) >> wq->wqe_shift;
+               wqe = be32_to_cpu(cqe->wqe);
+               wqe_index = wqe >> wq->wqe_shift;
+               /*
+               * WQE addr == base - 1 might be reported in receive completion
+               * with error instead of (rq size - 1) by Sinai FW 1.0.800,
+               * Arbel FW 5.1.400 and should be fixed in later revisions.
+               */
+               if (unlikely(wqe_index < 0))
+                       wqe_index = wq->max - 1;
                entry->wr_id = (*cur_qp)->wrid[wqe_index];
        }
 
-- 
MST

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to