]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
svcrdma: Add helper to save pages under I/O
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Apr 2017 17:06:00 +0000 (13:06 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 25 Apr 2017 21:25:54 +0000 (17:25 -0400)
Clean up: extract the logic to save pages under I/O into a helper to
add a big documenting comment without adding clutter in the send
path.

This is a refactoring change only.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/xprtrdma/svc_rdma_sendto.c

index a7dc71daa776249541d4e838dfe4ee23df71e29e..2798f3ea0020d8e2aa7e29999238eaeaf0d0db64 100644 (file)
@@ -478,6 +478,23 @@ out_err:
        return -EIO;
 }
 
+/* The svc_rqst and all resources it owns are released as soon as
+ * svc_rdma_sendto returns. Transfer pages under I/O to the ctxt
+ * so they are released by the Send completion handler.
+ */
+static void svc_rdma_save_io_pages(struct svc_rqst *rqstp,
+                                  struct svc_rdma_op_ctxt *ctxt)
+{
+       int i, pages = rqstp->rq_next_page - rqstp->rq_respages;
+
+       ctxt->count += pages;
+       for (i = 0; i < pages; i++) {
+               ctxt->pages[i + 1] = rqstp->rq_respages[i];
+               rqstp->rq_respages[i] = NULL;
+       }
+       rqstp->rq_next_page = rqstp->rq_respages + 1;
+}
+
 /**
  * svc_rdma_post_send_wr - Set up and post one Send Work Request
  * @rdma: controlling transport
@@ -543,8 +560,6 @@ static int send_reply(struct svcxprt_rdma *rdma,
        u32 xdr_off;
        int sge_no;
        int sge_bytes;
-       int page_no;
-       int pages;
        int ret = -EIO;
 
        /* Prepare the context */
@@ -587,17 +602,7 @@ static int send_reply(struct svcxprt_rdma *rdma,
                goto err;
        }
 
-       /* Save all respages in the ctxt and remove them from the
-        * respages array. They are our pages until the I/O
-        * completes.
-        */
-       pages = rqstp->rq_next_page - rqstp->rq_respages;
-       for (page_no = 0; page_no < pages; page_no++) {
-               ctxt->pages[page_no+1] = rqstp->rq_respages[page_no];
-               ctxt->count++;
-               rqstp->rq_respages[page_no] = NULL;
-       }
-       rqstp->rq_next_page = rqstp->rq_respages + 1;
+       svc_rdma_save_io_pages(rqstp, ctxt);
 
        if (sge_no > rdma->sc_max_sge) {
                pr_err("svcrdma: Too many sges (%d)\n", sge_no);