diff options
author | Chuck Lever | 2014-05-28 16:33:34 +0200 |
---|---|---|
committer | Anna Schumaker | 2014-06-04 14:56:43 +0200 |
commit | 7f23f6f6e388d2003c4ecf5d558f3c2191e12530 (patch) | |
tree | 082b8cfb518dd87fe8b0ff6e70f371022c12e180 /net | |
parent | xprtrdma: Split the completion queue (diff) | |
download | kernel-qcow2-linux-7f23f6f6e388d2003c4ecf5d558f3c2191e12530.tar.gz kernel-qcow2-linux-7f23f6f6e388d2003c4ecf5d558f3c2191e12530.tar.xz kernel-qcow2-linux-7f23f6f6e388d2003c4ecf5d558f3c2191e12530.zip |
xprtrmda: Reduce lock contention in completion handlers
Skip the ib_poll_cq() after re-arming, if the provider knows there
are no additional items waiting. (Have a look at commit ed23a727 for
more details).
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index af2d097c221f..c7d5281063fd 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -192,8 +192,11 @@ rpcrdma_sendcq_upcall(struct ib_cq *cq, void *cq_context) return; } - rc = ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); - if (rc) { + 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; @@ -272,8 +275,11 @@ rpcrdma_recvcq_upcall(struct ib_cq *cq, void *cq_context) return; } - rc = ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); - if (rc) { + 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; |