svcrdma: Retain the page backing rq_res.head[0].iov_base
authorChuck Lever <chuck.lever@oracle.com>
Mon, 1 Feb 2021 20:16:57 +0000 (15:16 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 22 Mar 2021 17:22:13 +0000 (13:22 -0400)
svc_rdma_sendto() now waits for the NIC hardware to finish with
the pages backing rq_res. We still have to release the page array
in some cases, but now it's always safe to immediately re-use the
page backing rq_res's head buffer.

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

index f093c9b..056452c 100644 (file)
@@ -957,6 +957,11 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
        ret = svc_rdma_send_reply_msg(rdma, sctxt, rctxt, rqstp);
        if (ret < 0)
                goto err1;
+
+       /* Prevent svc_xprt_release() from releasing the page backing
+        * rq_res.head[0].iov_base. It's no longer being accessed by
+        * the I/O device. */
+       rqstp->rq_respages++;
        return 0;
 
  err2: