SUNRPC: Avoid holding locks across the XDR encoding of the RPC message
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 14 Aug 2018 17:58:34 +0000 (13:58 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 30 Sep 2018 19:35:14 +0000 (15:35 -0400)
Currently, we grab the socket bit lock before we allow the message
to be XDR encoded. That significantly slows down the transmission
rate, since we serialise on a potentially blocking operation.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/clnt.c

index e5ac35e..a858366 100644 (file)
@@ -1949,9 +1949,6 @@ call_transmit(struct rpc_task *task)
        task->tk_action = call_status;
        if (task->tk_status < 0)
                return;
-       if (!xprt_prepare_transmit(task))
-               return;
-       task->tk_action = call_transmit_status;
        /* Encode here so that rpcsec_gss can use correct sequence number. */
        if (rpc_task_need_encode(task)) {
                rpc_xdr_encode(task);
@@ -1965,6 +1962,9 @@ call_transmit(struct rpc_task *task)
                        return;
                }
        }
+       if (!xprt_prepare_transmit(task))
+               return;
+       task->tk_action = call_transmit_status;
        xprt_transmit(task);
        if (task->tk_status < 0)
                return;