SUNRPC: Make RTT measurement more precise (Send)
authorChuck Lever <chuck.lever@oracle.com>
Mon, 5 Mar 2018 20:13:07 +0000 (15:13 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 10 Apr 2018 20:06:22 +0000 (16:06 -0400)
Some RPC transports have more overhead in their send_request
callouts than others. For example, for RPC-over-RDMA:

- Marshaling an RPC often has to DMA map the RPC arguments

- Registration methods perform memory registration as part of
  marshaling

To capture just server and network latencies more precisely: when
sending a Call, capture the rq_xtime timestamp _after_ the transport
header has been marshaled.

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

index cb7784c..73f05a1 100644 (file)
@@ -1033,7 +1033,6 @@ void xprt_transmit(struct rpc_task *task)
                return;
 
        connect_cookie = xprt->connect_cookie;
-       req->rq_xtime = ktime_get();
        status = xprt->ops->send_request(task);
        trace_xprt_transmit(xprt, req->rq_xid, status);
        if (status != 0) {
index 67e4386..cc1aad3 100644 (file)
@@ -696,6 +696,7 @@ xprt_rdma_send_request(struct rpc_task *task)
        /* Must suppress retransmit to maintain credits */
        if (rqst->rq_connect_cookie == xprt->connect_cookie)
                goto drop_connection;
+       rqst->rq_xtime = ktime_get();
 
        __set_bit(RPCRDMA_REQ_F_PENDING, &req->rl_flags);
        if (rpcrdma_ep_post(&r_xprt->rx_ia, &r_xprt->rx_ep, req))
index 61df77f..e3c6a3d 100644 (file)
@@ -527,6 +527,7 @@ static int xs_local_send_request(struct rpc_task *task)
        xs_pktdump("packet data:",
                        req->rq_svec->iov_base, req->rq_svec->iov_len);
 
+       req->rq_xtime = ktime_get();
        status = xs_sendpages(transport->sock, NULL, 0, xdr, req->rq_bytes_sent,
                              true, &sent);
        dprintk("RPC:       %s(%u) = %d\n",
@@ -589,6 +590,7 @@ static int xs_udp_send_request(struct rpc_task *task)
 
        if (!xprt_bound(xprt))
                return -ENOTCONN;
+       req->rq_xtime = ktime_get();
        status = xs_sendpages(transport->sock, xs_addr(xprt), xprt->addrlen,
                              xdr, req->rq_bytes_sent, true, &sent);
 
@@ -678,6 +680,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
        /* Continue transmitting the packet/record. We must be careful
         * to cope with writespace callbacks arriving _after_ we have
         * called sendmsg(). */
+       req->rq_xtime = ktime_get();
        while (1) {
                sent = 0;
                status = xs_sendpages(transport->sock, NULL, 0, xdr,