crypto: scatterwalk - Hide PageSlab call to optimise away flush_dcache_page
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 1 Jun 2015 08:22:03 +0000 (16:22 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 3 Jun 2015 02:51:25 +0000 (10:51 +0800)
On architectures where flush_dcache_page is not needed, we will
end up generating all the code up to the PageSlab call.  This is
because PageSlab operates on a volatile pointer and thus cannot
be optimised away.

This patch works around this by checking whether flush_dcache_page
is needed before we call PageSlab which then allows PageSlab to be
compiled awy.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/scatterwalk.c

index 2ef9cbbc5dbf326904bac71359e559402b1cd35b..ea5815c5e12817912e1749d6aaf1a84606d7e7f3 100644 (file)
@@ -54,7 +54,11 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out,
                struct page *page;
 
                page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT);
-               if (!PageSlab(page))
+               /* Test ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE first as
+                * PageSlab cannot be optimised away per se due to
+                * use of volatile pointer.
+                */
+               if (ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE && !PageSlab(page))
                        flush_dcache_page(page);
        }