erofs: avoid consecutive detection for Highmem memory
[ Upstream commit 448b5a1548d87c246c3d0c3df8480d3c6eb6c11a ]
Currently, vmap()s are avoided if physical addresses are
consecutive for decompressed buffers.
I observed that is very common for 4KiB pclusters since the
numbers of decompressed pages are almost 2 or 3.
However, such detection doesn't work for Highmem pages on
32-bit machines, let's fix it now.
Reported-by: Liu Jinbao <liujinbao1@xiaomi.com>
Fixes: 7fc45dbc93
("staging: erofs: introduce generic decompression backend")
Link: https://lore.kernel.org/r/20220708101001.21242-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
62060951cc
commit
bee4d2ab4d
@ -56,14 +56,18 @@ static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq,
|
|||||||
|
|
||||||
if (page) {
|
if (page) {
|
||||||
__clear_bit(j, bounced);
|
__clear_bit(j, bounced);
|
||||||
if (kaddr) {
|
if (!PageHighMem(page)) {
|
||||||
if (kaddr + PAGE_SIZE == page_address(page))
|
if (!i) {
|
||||||
|
kaddr = page_address(page);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (kaddr &&
|
||||||
|
kaddr + PAGE_SIZE == page_address(page)) {
|
||||||
kaddr += PAGE_SIZE;
|
kaddr += PAGE_SIZE;
|
||||||
else
|
continue;
|
||||||
kaddr = NULL;
|
}
|
||||||
} else if (!i) {
|
|
||||||
kaddr = page_address(page);
|
|
||||||
}
|
}
|
||||||
|
kaddr = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
kaddr = NULL;
|
kaddr = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user