svcrdma: Avoid releasing a page in svc_xprt_release()
authorChuck Lever <chuck.lever@oracle.com>
Fri, 27 Jul 2018 15:18:54 +0000 (11:18 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 9 Aug 2018 20:11:21 +0000 (16:11 -0400)
commita53d5cb0646a12586ae45c892c7a411d47ee1a1d
tree8342ebe172d876e8e0358fc0531cf3f75d3e7e58
parent7b4d6da4bb6d0ece17ca27f0b4612df87f873d83
svcrdma: Avoid releasing a page in svc_xprt_release()

svc_xprt_release() invokes svc_free_res_pages(), which releases
pages between rq_respages and rq_next_page.

Historically, the RPC/RDMA transport has set these two pointers to
be different by one, which means:

- one page gets released when svc_recv returns 0. This normally
happens whenever one or more RDMA Reads need to be dispatched to
complete construction of an RPC Call.

- one page gets released after every call to svc_send.

In both cases, this released page is immediately refilled by
svc_alloc_arg. There does not seem to be a reason for releasing this
page.

To avoid this unnecessary memory allocator traffic, set rq_next_page
more carefully.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_sendto.c