IB/core: Add support for draining IB_POLL_DIRECT completion queues
authorBart Van Assche <bart.vanassche@sandisk.com>
Tue, 14 Feb 2017 18:56:35 +0000 (10:56 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 19 Feb 2017 14:51:55 +0000 (09:51 -0500)
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Steve Wise <swise@opengridcomputing.com>
Cc: Chuck Lever <chuck.lever@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Max Gurtovoy <maxg@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/cq.c
drivers/infiniband/core/verbs.c

index 838147ef727f89922af6f3528f0f9166af73151c..e95510117a6dd7069f1251796eaebd1ea8283693 100644 (file)
@@ -58,8 +58,8 @@ static int __ib_process_cq(struct ib_cq *cq, int budget)
  * %IB_POLL_DIRECT CQ.  It does not offload CQ processing to a different
  * context and does not ask for completion interrupts from the HCA.
  *
- * Note: for compatibility reasons -1 can be passed in %budget for unlimited
- * polling.  Do not use this feature in new code, it will be removed soon.
+ * Note: do not pass -1 as %budget unless it is guaranteed that the number
+ * of completions that will be processed is small.
  */
 int ib_process_cq_direct(struct ib_cq *cq, int budget)
 {
index 9b77fbc869038d260e9d795f78d44798ec73f9b2..85ed5051fdfd3133dbf92025d3eab8118c3c8596 100644 (file)
@@ -1948,17 +1948,12 @@ static void ib_drain_qp_done(struct ib_cq *cq, struct ib_wc *wc)
  */
 static void __ib_drain_sq(struct ib_qp *qp)
 {
+       struct ib_cq *cq = qp->send_cq;
        struct ib_qp_attr attr = { .qp_state = IB_QPS_ERR };
        struct ib_drain_cqe sdrain;
        struct ib_send_wr swr = {}, *bad_swr;
        int ret;
 
-       if (qp->send_cq->poll_ctx == IB_POLL_DIRECT) {
-               WARN_ONCE(qp->send_cq->poll_ctx == IB_POLL_DIRECT,
-                         "IB_POLL_DIRECT poll_ctx not supported for drain\n");
-               return;
-       }
-
        swr.wr_cqe = &sdrain.cqe;
        sdrain.cqe.done = ib_drain_qp_done;
        init_completion(&sdrain.done);
@@ -1975,7 +1970,11 @@ static void __ib_drain_sq(struct ib_qp *qp)
                return;
        }
 
-       wait_for_completion(&sdrain.done);
+       if (cq->poll_ctx == IB_POLL_DIRECT)
+               while (wait_for_completion_timeout(&sdrain.done, HZ / 10) <= 0)
+                       ib_process_cq_direct(cq, -1);
+       else
+               wait_for_completion(&sdrain.done);
 }
 
 /*
@@ -1983,17 +1982,12 @@ static void __ib_drain_sq(struct ib_qp *qp)
  */
 static void __ib_drain_rq(struct ib_qp *qp)
 {
+       struct ib_cq *cq = qp->recv_cq;
        struct ib_qp_attr attr = { .qp_state = IB_QPS_ERR };
        struct ib_drain_cqe rdrain;
        struct ib_recv_wr rwr = {}, *bad_rwr;
        int ret;
 
-       if (qp->recv_cq->poll_ctx == IB_POLL_DIRECT) {
-               WARN_ONCE(qp->recv_cq->poll_ctx == IB_POLL_DIRECT,
-                         "IB_POLL_DIRECT poll_ctx not supported for drain\n");
-               return;
-       }
-
        rwr.wr_cqe = &rdrain.cqe;
        rdrain.cqe.done = ib_drain_qp_done;
        init_completion(&rdrain.done);
@@ -2010,7 +2004,11 @@ static void __ib_drain_rq(struct ib_qp *qp)
                return;
        }
 
-       wait_for_completion(&rdrain.done);
+       if (cq->poll_ctx == IB_POLL_DIRECT)
+               while (wait_for_completion_timeout(&rdrain.done, HZ / 10) <= 0)
+                       ib_process_cq_direct(cq, -1);
+       else
+               wait_for_completion(&rdrain.done);
 }
 
 /**
@@ -2027,8 +2025,7 @@ static void __ib_drain_rq(struct ib_qp *qp)
  * ensure there is room in the CQ and SQ for the drain work request and
  * completion.
  *
- * allocate the CQ using ib_alloc_cq() and the CQ poll context cannot be
- * IB_POLL_DIRECT.
+ * allocate the CQ using ib_alloc_cq().
  *
  * ensure that there are no other contexts that are posting WRs concurrently.
  * Otherwise the drain is not guaranteed.
@@ -2056,8 +2053,7 @@ EXPORT_SYMBOL(ib_drain_sq);
  * ensure there is room in the CQ and RQ for the drain work request and
  * completion.
  *
- * allocate the CQ using ib_alloc_cq() and the CQ poll context cannot be
- * IB_POLL_DIRECT.
+ * allocate the CQ using ib_alloc_cq().
  *
  * ensure that there are no other contexts that are posting WRs concurrently.
  * Otherwise the drain is not guaranteed.
@@ -2081,8 +2077,7 @@ EXPORT_SYMBOL(ib_drain_rq);
  * ensure there is room in the CQ(s), SQ, and RQ for drain work requests
  * and completions.
  *
- * allocate the CQs using ib_alloc_cq() and the CQ poll context cannot be
- * IB_POLL_DIRECT.
+ * allocate the CQs using ib_alloc_cq().
  *
  * ensure that there are no other contexts that are posting WRs concurrently.
  * Otherwise the drain is not guaranteed.