[IB] mthca: detect SRQ overflow
authorRoland Dreier <rolandd@cisco.com>
Thu, 6 Oct 2005 20:25:16 +0000 (13:25 -0700)
committerRoland Dreier <rolandd@cisco.com>
Mon, 17 Oct 2005 22:20:28 +0000 (15:20 -0700)
The hardware relies on us keeping one extra work request that never
gets used in SRQs.  Add checks to the SRQ work request posting
functions so that they fail when someone is about to use up that extra
work request, rather than when someone uses the very last work request.

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

index 13d2290261d96c881b5e3c6dcdd8cd08e0bf72b4..e464321a7aa7a0512676afd7390d7097a6d3e3a7 100644 (file)
@@ -438,6 +438,14 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
 
                wqe       = get_wqe(srq, ind);
                next_ind  = *wqe_to_link(wqe);
+
+               if (next_ind < 0) {
+                       mthca_err(dev, "SRQ %06x full\n", srq->srqn);
+                       err = -ENOMEM;
+                       *bad_wr = wr;
+                       break;
+               }
+
                prev_wqe  = srq->last;
                srq->last = wqe;
 
@@ -529,6 +537,13 @@ int mthca_arbel_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
                wqe       = get_wqe(srq, ind);
                next_ind  = *wqe_to_link(wqe);
 
+               if (next_ind < 0) {
+                       mthca_err(dev, "SRQ %06x full\n", srq->srqn);
+                       err = -ENOMEM;
+                       *bad_wr = wr;
+                       break;
+               }
+
                ((struct mthca_next_seg *) wqe)->nda_op =
                        cpu_to_be32((next_ind << srq->wqe_shift) | 1);
                ((struct mthca_next_seg *) wqe)->ee_nds = 0;