RDMA/cxgb4: Don't exceed hw IQ depth limit for user CQs
authorSteve Wise <swise@opengridcomputing.com>
Wed, 1 Jun 2011 17:49:14 +0000 (17:49 +0000)
committerRoland Dreier <roland@purestorage.com>
Fri, 17 Jun 2011 18:52:45 +0000 (11:52 -0700)
Memory allocated for user CQs gets rounded up to the next page
boundary.  And after rounding, we recalculate the resulting IQ depth
and we need to make sure we don't exceed the HW limits.

This bug can result a much smaller CQ allocated than was expected if
the HW size field is exceeded, resulting in CQ overflow failures.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/cxgb4/cq.c

index 8d8f8add6fcd93e71fd5b8931616554099bd7b00..1720dc790d13d1367594478a95ad1c9148bb91b1 100644 (file)
@@ -801,6 +801,10 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,
        if (ucontext) {
                memsize = roundup(memsize, PAGE_SIZE);
                hwentries = memsize / sizeof *chp->cq.queue;
+               while (hwentries > T4_MAX_IQ_SIZE) {
+                       memsize -= PAGE_SIZE;
+                       hwentries = memsize / sizeof *chp->cq.queue;
+               }
        }
        chp->cq.size = hwentries;
        chp->cq.memsize = memsize;