crypto: scatterwalk - Use nth_page instead of doing it by hand

Curiously, the Crypto API scatterwalk incremented pages by hand
rather than using nth_page.  Possibly because scatterwalk predates
nth_page (the following commit is from the history tree):

	commit 3957f2b34960d85b63e814262a8be7d5ad91444d
	Author: James Morris <jmorris@intercode.com.au>
	Date:   Sun Feb 2 07:35:32 2003 -0800

	    [CRYPTO]: in/out scatterlist support for ciphers.

Fix this by using nth_page.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Herbert Xu
2025-03-14 11:27:20 +08:00
parent 795e5bdb0a
commit e9ed7aff25

View File

@@ -100,11 +100,15 @@ static inline void scatterwalk_get_sglist(struct scatter_walk *walk,
static inline void scatterwalk_map(struct scatter_walk *walk)
{
struct page *base_page = sg_page(walk->sg);
unsigned int offset = walk->offset;
void *addr;
if (IS_ENABLED(CONFIG_HIGHMEM)) {
walk->__addr = kmap_local_page(base_page +
(walk->offset >> PAGE_SHIFT)) +
offset_in_page(walk->offset);
struct page *page;
page = nth_page(base_page, offset >> PAGE_SHIFT);
offset = offset_in_page(offset);
addr = kmap_local_page(page) + offset;
} else {
/*
* When !HIGHMEM we allow the walker to return segments that
@@ -117,8 +121,10 @@ static inline void scatterwalk_map(struct scatter_walk *walk)
* in the direct map, but this makes it clearer what is really
* going on.
*/
walk->__addr = page_address(base_page) + walk->offset;
addr = page_address(base_page) + offset;
}
walk->__addr = addr;
}
/**
@@ -189,14 +195,18 @@ static inline void scatterwalk_done_dst(struct scatter_walk *walk,
* reliably optimized out or not.
*/
if (ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE) {
struct page *base_page, *start_page, *end_page, *page;
struct page *base_page;
unsigned int offset;
int start, end, i;
base_page = sg_page(walk->sg);
start_page = base_page + (walk->offset >> PAGE_SHIFT);
end_page = base_page + ((walk->offset + nbytes +
PAGE_SIZE - 1) >> PAGE_SHIFT);
for (page = start_page; page < end_page; page++)
flush_dcache_page(page);
offset = walk->offset;
start = offset >> PAGE_SHIFT;
end = start + (nbytes >> PAGE_SHIFT);
end += (offset_in_page(offset) + offset_in_page(nbytes) +
PAGE_SIZE - 1) >> PAGE_SHIFT;
for (i = start; i < end; i++)
flush_dcache_page(nth_page(base_page, i));
}
scatterwalk_advance(walk, nbytes);
}