|
@@ -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.
|