]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
SUNRPC: Optimise away unnecessary data moves in xdr_align_pages
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 2 Aug 2012 17:21:43 +0000 (13:21 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 19 Sep 2012 22:16:17 +0000 (18:16 -0400)
Warning! Contains debugging printks!

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/xdr.c

index fbbd1c475b43c617b5e3061e8c941867578b07b2..e30842b20c94042a49c4138511dc65156e362661 100644 (file)
@@ -730,21 +730,26 @@ static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len)
 
        if (xdr->nwords == 0)
                return 0;
-       if (nwords > xdr->nwords) {
-               nwords = xdr->nwords;
-               len = nwords << 2;
-       }
        /* Realign pages to current pointer position */
        iov  = buf->head;
-       if (iov->iov_len > cur)
+       if (iov->iov_len > cur) {
                xdr_shrink_bufhead(buf, iov->iov_len - cur);
+               xdr->nwords = XDR_QUADLEN(buf->len - cur);
+       } else if (iov->iov_len != cur)
+               pr_warning("%s: could not align to page boundary!\n", __func__);
 
-       /* Truncate page data and move it into the tail */
-       if (buf->page_len > len)
-               xdr_shrink_pagelen(buf, buf->page_len - len);
-       else
+       if (nwords > xdr->nwords) {
+               nwords = xdr->nwords;
+               len = nwords << 2;
+       }
+       if (buf->page_len <= len)
                len = buf->page_len;
-       xdr->nwords = XDR_QUADLEN(buf->len - cur);
+       else if (nwords < xdr->nwords) {
+               /* Truncate page data and move it into the tail */
+               xdr_shrink_pagelen(buf, buf->page_len - len);
+               xdr->nwords = XDR_QUADLEN(buf->len - cur);
+       } else
+               pr_info("%s: Optimised away a data move!\n", __func__);
        return len;
 }