Patch "erofs: avoid consecutive detection for Highmem memory" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    erofs: avoid consecutive detection for Highmem memory

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     erofs-avoid-consecutive-detection-for-highmem-memory.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 441791599365aa6229063ec0e657171318a19b53
Author: Gao Xiang <xiang@xxxxxxxxxx>
Date:   Fri Jul 8 18:10:01 2022 +0800

    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@xxxxxxxxxx>
    Fixes: 7fc45dbc938a ("staging: erofs: introduce generic decompression backend")
    Link: https://lore.kernel.org/r/20220708101001.21242-1-hsiangkao@xxxxxxxxxxxxxxxxx
    Signed-off-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c
index 8a6260aac26c..f921580b56cb 100644
--- a/fs/erofs/decompressor.c
+++ b/fs/erofs/decompressor.c
@@ -56,14 +56,18 @@ static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq,
 
 		if (page) {
 			__clear_bit(j, bounced);
-			if (kaddr) {
-				if (kaddr + PAGE_SIZE == page_address(page))
+			if (!PageHighMem(page)) {
+				if (!i) {
+					kaddr = page_address(page);
+					continue;
+				}
+				if (kaddr &&
+				    kaddr + PAGE_SIZE == page_address(page)) {
 					kaddr += PAGE_SIZE;
-				else
-					kaddr = NULL;
-			} else if (!i) {
-				kaddr = page_address(page);
+					continue;
+				}
 			}
+			kaddr = NULL;
 			continue;
 		}
 		kaddr = NULL;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux