xprtrdma: Use xprt_pin_rqst in rpcrdma_reply_handler
Adopt the use of xprt_pin_rqst to eliminate contention between
Call-side users of rb_lock and the use of rb_lock in
rpcrdma_reply_handler.
This replaces the mechanism introduced in 431af645cf
("xprtrdma:
Fix client lock-up after application signal fires").
Use recv_lock to quickly find the completing rqst, pin it, then
drop the lock. At that point invalidation and pull-up of the Reply
XDR can be done. Both are often expensive operations.
Finally, take recv_lock again to signal completion to the RPC
layer. It also protects adjustment of "cwnd".
This greatly reduces the amount of time a lock is held by the
reply handler. Comparing lock_stat results shows a marked decrease
in contention on rb_lock and recv_lock.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
[trond.myklebust@primarydata.com: Remove call to rpcrdma_buffer_put() from
the "out_norqst:" path in rpcrdma_reply_handler.]
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:

committed by
Trond Myklebust

parent
f9773b22a2
commit
9590d083c1
@@ -855,6 +855,7 @@ void xprt_pin_rqst(struct rpc_rqst *req)
|
||||
{
|
||||
set_bit(RPC_TASK_MSG_RECV, &req->rq_task->tk_runstate);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xprt_pin_rqst);
|
||||
|
||||
/**
|
||||
* xprt_unpin_rqst - Unpin a request on the transport receive list
|
||||
@@ -870,6 +871,7 @@ void xprt_unpin_rqst(struct rpc_rqst *req)
|
||||
if (test_bit(RPC_TASK_MSG_RECV_WAIT, &task->tk_runstate))
|
||||
wake_up_bit(&task->tk_runstate, RPC_TASK_MSG_RECV);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xprt_unpin_rqst);
|
||||
|
||||
static void xprt_wait_on_pinned_rqst(struct rpc_rqst *req)
|
||||
__must_hold(&req->rq_xprt->recv_lock)
|
||||
|
Reference in New Issue
Block a user