|
@@ -179,38 +179,17 @@ rpcrdma_sendcq_poll(struct ib_cq *cq, struct rpcrdma_ep *ep)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Handle send, fast_reg_mr, and local_inv completions.
|
|
|
- *
|
|
|
- * Send events are typically suppressed and thus do not result
|
|
|
- * in an upcall. Occasionally one is signaled, however. This
|
|
|
- * prevents the provider's completion queue from wrapping and
|
|
|
- * losing a completion.
|
|
|
+/* Handle provider send completion upcalls.
|
|
|
*/
|
|
|
static void
|
|
|
rpcrdma_sendcq_upcall(struct ib_cq *cq, void *cq_context)
|
|
|
{
|
|
|
struct rpcrdma_ep *ep = (struct rpcrdma_ep *)cq_context;
|
|
|
- int rc;
|
|
|
-
|
|
|
- rc = rpcrdma_sendcq_poll(cq, ep);
|
|
|
- if (rc) {
|
|
|
- dprintk("RPC: %s: ib_poll_cq failed: %i\n",
|
|
|
- __func__, rc);
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- rc = ib_req_notify_cq(cq,
|
|
|
- IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS);
|
|
|
- if (rc == 0)
|
|
|
- return;
|
|
|
- if (rc < 0) {
|
|
|
- dprintk("RPC: %s: ib_req_notify_cq failed: %i\n",
|
|
|
- __func__, rc);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- rpcrdma_sendcq_poll(cq, ep);
|
|
|
+ do {
|
|
|
+ rpcrdma_sendcq_poll(cq, ep);
|
|
|
+ } while (ib_req_notify_cq(cq, IB_CQ_NEXT_COMP |
|
|
|
+ IB_CQ_REPORT_MISSED_EVENTS) > 0);
|
|
|
}
|
|
|
|
|
|
static void
|
|
@@ -274,42 +253,17 @@ out_schedule:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Handle receive completions.
|
|
|
- *
|
|
|
- * It is reentrant but processes single events in order to maintain
|
|
|
- * ordering of receives to keep server credits.
|
|
|
- *
|
|
|
- * It is the responsibility of the scheduled tasklet to return
|
|
|
- * recv buffers to the pool. NOTE: this affects synchronization of
|
|
|
- * connection shutdown. That is, the structures required for
|
|
|
- * the completion of the reply handler must remain intact until
|
|
|
- * all memory has been reclaimed.
|
|
|
+/* Handle provider receive completion upcalls.
|
|
|
*/
|
|
|
static void
|
|
|
rpcrdma_recvcq_upcall(struct ib_cq *cq, void *cq_context)
|
|
|
{
|
|
|
struct rpcrdma_ep *ep = (struct rpcrdma_ep *)cq_context;
|
|
|
- int rc;
|
|
|
-
|
|
|
- rc = rpcrdma_recvcq_poll(cq, ep);
|
|
|
- if (rc) {
|
|
|
- dprintk("RPC: %s: ib_poll_cq failed: %i\n",
|
|
|
- __func__, rc);
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- rc = ib_req_notify_cq(cq,
|
|
|
- IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS);
|
|
|
- if (rc == 0)
|
|
|
- return;
|
|
|
- if (rc < 0) {
|
|
|
- dprintk("RPC: %s: ib_req_notify_cq failed: %i\n",
|
|
|
- __func__, rc);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- rpcrdma_recvcq_poll(cq, ep);
|
|
|
+ do {
|
|
|
+ rpcrdma_recvcq_poll(cq, ep);
|
|
|
+ } while (ib_req_notify_cq(cq, IB_CQ_NEXT_COMP |
|
|
|
+ IB_CQ_REPORT_MISSED_EVENTS) > 0);
|
|
|
}
|
|
|
|
|
|
static void
|