xprtrdma: Avoid calls to ro_unmap_safe()
authorChuck Lever <chuck.lever@oracle.com>
Tue, 29 Nov 2016 15:52:48 +0000 (10:52 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 29 Nov 2016 21:45:44 +0000 (16:45 -0500)
Micro-optimization: Most of the time, calls to ro_unmap_safe are
expensive no-ops. Call only when there is work to do.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/transport.c

index ed5e285..545d3fc 100644 (file)
@@ -621,7 +621,8 @@ xprt_rdma_free(struct rpc_task *task)
 
        dprintk("RPC:       %s: called on 0x%p\n", __func__, req->rl_reply);
 
-       ia->ri_ops->ro_unmap_safe(r_xprt, req, !RPC_IS_ASYNC(task));
+       if (unlikely(!list_empty(&req->rl_registered)))
+               ia->ri_ops->ro_unmap_safe(r_xprt, req, !RPC_IS_ASYNC(task));
        rpcrdma_unmap_sges(ia, req);
        rpcrdma_buffer_put(req);
 }
@@ -657,7 +658,8 @@ xprt_rdma_send_request(struct rpc_task *task)
        int rc = 0;
 
        /* On retransmit, remove any previously registered chunks */
-       r_xprt->rx_ia.ri_ops->ro_unmap_safe(r_xprt, req, false);
+       if (unlikely(!list_empty(&req->rl_registered)))
+               r_xprt->rx_ia.ri_ops->ro_unmap_safe(r_xprt, req, false);
 
        rc = rpcrdma_marshal_req(rqst);
        if (rc < 0)