]> err.no Git - linux-2.6/commitdiff
[IB] mthca: Avoid SRQ free WQE list corruption
authorRoland Dreier <rolandd@cisco.com>
Sun, 30 Oct 2005 21:07:03 +0000 (13:07 -0800)
committerRoland Dreier <rolandd@cisco.com>
Mon, 31 Oct 2005 15:10:32 +0000 (07:10 -0800)
Fix wqe_to_link() to use a structure field that we know is definitely
always unused for receive work requests, so that it really avoids the
free list corruption bug that the comment claims it does.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/mthca/mthca_srq.c

index 64f70aa1b3c09a704cc8885ca622445ed099f1c1..292f55be8cbd8c6eef90a0a6d884ac0261de9652 100644 (file)
@@ -75,15 +75,16 @@ static void *get_wqe(struct mthca_srq *srq, int n)
 
 /*
  * Return a pointer to the location within a WQE that we're using as a
- * link when the WQE is in the free list.  We use an offset of 4
- * because in the Tavor case, posting a WQE may overwrite the first
- * four bytes of the previous WQE.  The offset avoids corrupting our
- * free list if the WQE has already completed and been put on the free
- * list when we post the next WQE.
+ * link when the WQE is in the free list.  We use the imm field
+ * because in the Tavor case, posting a WQE may overwrite the next
+ * segment of the previous WQE, but a receive WQE will never touch the
+ * imm field.  This avoids corrupting our free list if the previous
+ * WQE has already completed and been put on the free list when we
+ * post the next WQE.
  */
 static inline int *wqe_to_link(void *wqe)
 {
-       return (int *) (wqe + 4);
+       return (int *) (wqe + offsetof(struct mthca_next_seg, imm));
 }
 
 static void mthca_tavor_init_srq_context(struct mthca_dev *dev,