Commit bd79bc57 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Don't take transport->lock unnecessarily when taking XPRT_LOCK

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent adfa7144
...@@ -298,6 +298,8 @@ static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task) ...@@ -298,6 +298,8 @@ static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task)
{ {
int retval; int retval;
if (test_bit(XPRT_LOCKED, &xprt->state) && xprt->snd_task == task)
return 1;
spin_lock_bh(&xprt->transport_lock); spin_lock_bh(&xprt->transport_lock);
retval = xprt->ops->reserve_xprt(xprt, task); retval = xprt->ops->reserve_xprt(xprt, task);
spin_unlock_bh(&xprt->transport_lock); spin_unlock_bh(&xprt->transport_lock);
...@@ -375,6 +377,8 @@ EXPORT_SYMBOL_GPL(xprt_release_xprt_cong); ...@@ -375,6 +377,8 @@ EXPORT_SYMBOL_GPL(xprt_release_xprt_cong);
static inline void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task) static inline void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task)
{ {
if (xprt->snd_task != task)
return;
spin_lock_bh(&xprt->transport_lock); spin_lock_bh(&xprt->transport_lock);
xprt->ops->release_xprt(xprt, task); xprt->ops->release_xprt(xprt, task);
spin_unlock_bh(&xprt->transport_lock); spin_unlock_bh(&xprt->transport_lock);
...@@ -1645,8 +1649,7 @@ void xprt_release(struct rpc_task *task) ...@@ -1645,8 +1649,7 @@ void xprt_release(struct rpc_task *task)
if (req == NULL) { if (req == NULL) {
if (task->tk_client) { if (task->tk_client) {
xprt = task->tk_xprt; xprt = task->tk_xprt;
if (xprt->snd_task == task) xprt_release_write(xprt, task);
xprt_release_write(xprt, task);
} }
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment