Patch "mm/highmem: Lift memcpy_[to|from]_page to core" has been added to the 5.4-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

    mm/highmem: Lift memcpy_[to|from]_page to core

to the 5.4-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:
     mm-highmem-lift-memcpy_-to-from-_page-to-core.patch
and it can be found in the queue-5.4 subdirectory.

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



commit 6a652141db3eebe1e2ee16009210cb3d4e76d78c
Author: Ira Weiny <ira.weiny@xxxxxxxxx>
Date:   Tue Feb 9 22:22:14 2021 -0800

    mm/highmem: Lift memcpy_[to|from]_page to core
    
    [ Upstream commit bb90d4bc7b6a536b2e4db45f4763e467c2008251 ]
    
    Working through a conversion to a call kmap_local_page() instead of
    kmap() revealed many places where the pattern kmap/memcpy/kunmap
    occurred.
    
    Eric Biggers, Matthew Wilcox, Christoph Hellwig, Dan Williams, and Al
    Viro all suggested putting this code into helper functions.  Al Viro
    further pointed out that these functions already existed in the iov_iter
    code.[1]
    
    Various locations for the lifted functions were considered.
    
    Headers like mm.h or string.h seem ok but don't really portray the
    functionality well.  pagemap.h made some sense but is for page cache
    functionality.[2]
    
    Another alternative would be to create a new header for the promoted
    memcpy functions, but it masks the fact that these are designed to copy
    to/from pages using the kernel direct mappings and complicates matters
    with a new header.
    
    Placing these functions in 'highmem.h' is suboptimal especially with the
    changes being proposed in the functionality of kmap.  From a caller
    perspective including/using 'highmem.h' implies that the functions
    defined in that header are only required when highmem is in use which is
    increasingly not the case with modern processors.  However, highmem.h is
    where all the current functions like this reside (zero_user(),
    clear_highpage(), clear_user_highpage(), copy_user_highpage(), and
    copy_highpage()).  So it makes the most sense even though it is
    distasteful for some.[3]
    
    Lift memcpy_to_page() and memcpy_from_page() to pagemap.h.
    
    [1] https://lore.kernel.org/lkml/20201013200149.GI3576660@xxxxxxxxxxxxxxxxxx/
        https://lore.kernel.org/lkml/20201013112544.GA5249@xxxxxxxxxxxxx/
    
    [2] https://lore.kernel.org/lkml/20201208122316.GH7338@xxxxxxxxxxxxxxxxxxxx/
    
    [3] https://lore.kernel.org/lkml/20201013200149.GI3576660@xxxxxxxxxxxxxxxxxx/#t
        https://lore.kernel.org/lkml/20201208163814.GN1563847@xxxxxxxxxxxxxxxxxxxxxxxxx/
    
    Cc: Boris Pismenny <borisp@xxxxxxxxxxxx>
    Cc: Or Gerlitz <gerlitz.or@xxxxxxxxx>
    Cc: Dave Hansen <dave.hansen@xxxxxxxxx>
    Suggested-by: Matthew Wilcox <willy@xxxxxxxxxxxxx>
    Suggested-by: Christoph Hellwig <hch@xxxxxxxxxxxxx>
    Suggested-by: Dan Williams <dan.j.williams@xxxxxxxxx>
    Suggested-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
    Suggested-by: Eric Biggers <ebiggers@xxxxxxxxxx>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@xxxxxxx>
    Reviewed-by: Christoph Hellwig <hch@xxxxxx>
    Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Stable-dep-of: 956510c0c743 ("fs: ext4: initialize fsdata in pagecache_write()")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index ea5cdbd8c2c3..900f224bb640 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -276,4 +276,22 @@ static inline void copy_highpage(struct page *to, struct page *from)
 
 #endif
 
+static inline void memcpy_from_page(char *to, struct page *page,
+				    size_t offset, size_t len)
+{
+	char *from = kmap_atomic(page);
+
+	memcpy(to, from + offset, len);
+	kunmap_atomic(from);
+}
+
+static inline void memcpy_to_page(struct page *page, size_t offset,
+				  const char *from, size_t len)
+{
+	char *to = kmap_atomic(page);
+
+	memcpy(to + offset, from, len);
+	kunmap_atomic(to);
+}
+
 #endif /* _LINUX_HIGHMEM_H */
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 9d3bda3d49fe..5c6a0b8a2adb 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -455,20 +455,6 @@ void iov_iter_init(struct iov_iter *i, unsigned int direction,
 }
 EXPORT_SYMBOL(iov_iter_init);
 
-static void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len)
-{
-	char *from = kmap_atomic(page);
-	memcpy(to, from + offset, len);
-	kunmap_atomic(from);
-}
-
-static void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len)
-{
-	char *to = kmap_atomic(page);
-	memcpy(to + offset, from, len);
-	kunmap_atomic(to);
-}
-
 static void memzero_page(struct page *page, size_t offset, size_t len)
 {
 	char *addr = kmap_atomic(page);



[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