RDMA/cxgb4: Fix accounting for unsignaled SQ WRs to deal with wrap
authorSteve Wise <swise@opengridcomputing.com>
Tue, 6 Aug 2013 15:34:36 +0000 (21:04 +0530)
committerRoland Dreier <roland@purestorage.com>
Tue, 13 Aug 2013 18:55:46 +0000 (11:55 -0700)
When determining how many WRs are completed with a signaled CQE,
correctly deal with queue wraps.

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

index 6657390de95621a53a7a2bbce16f10eb66d16982..88de3aa9c5b0205952299a7823ad0bfc071d3a5d 100644 (file)
@@ -611,9 +611,12 @@ proc_cqe:
                * to the first unsignaled one, and idx points to the
                * signaled one.  So adjust in_use based on this delta.
                * if this is not completing any unsigned wrs, then the
-               * delta will be 0.
+               * delta will be 0. Handle wrapping also!
                */
-               wq->sq.in_use -= idx - wq->sq.cidx;
+               if (idx < wq->sq.cidx)
+                       wq->sq.in_use -= wq->sq.size + idx - wq->sq.cidx;
+               else
+                       wq->sq.in_use -= idx - wq->sq.cidx;
                BUG_ON(wq->sq.in_use < 0 && wq->sq.in_use < wq->sq.size);
 
                wq->sq.cidx = (uint16_t)idx;