linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* fix memcpy_to_page and memzero_page
@ 2021-07-13  5:52 Christoph Hellwig
  2021-07-13  5:52 ` [PATCH 1/2] mm: call flush_dcache_page in " Christoph Hellwig
  2021-07-13  5:52 ` [PATCH 2/2] mm: use kmap_local_page in memzero_page Christoph Hellwig
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph Hellwig @ 2021-07-13  5:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Ira Weiny, linux-kernel, linux-mm

Hi all,

we need to call flush_dcache_page on any kmapped page, and on any page
we write to that may be mapped into the page cache, which can happen
quite frequently for anything we use raw pages for.

Patch 1 make sure memcpy_to_page and memzero_page to do the right thing
for that, and patch 2 fixes up the lost switch to kmap_local_page for
memzero_page.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] mm: call flush_dcache_page in memcpy_to_page and memzero_page
  2021-07-13  5:52 fix memcpy_to_page and memzero_page Christoph Hellwig
@ 2021-07-13  5:52 ` Christoph Hellwig
  2021-07-14  1:31   ` Andrew Morton
  2021-07-14  8:09   ` Ira Weiny
  2021-07-13  5:52 ` [PATCH 2/2] mm: use kmap_local_page in memzero_page Christoph Hellwig
  1 sibling, 2 replies; 6+ messages in thread
From: Christoph Hellwig @ 2021-07-13  5:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Ira Weiny, linux-kernel, linux-mm

memcpy_to_page and memzero_page can write to arbitrary pages, which could
be in the page cache or in high memory, so  call flush_kernel_dcache_pages
to flush the dcache.

Fixes: bb90d4bc7b6a ("mm/highmem: Lift memcpy_[to|from]_page to core")
Fixes: 28961998f858 ("iov_iter: lift memzero_page() to highmem.h")
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 include/linux/highmem.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 8c6e8e996c87..8e7e50a53a12 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -318,6 +318,7 @@ static inline void memcpy_to_page(struct page *page, size_t offset,
 
 	VM_BUG_ON(offset + len > PAGE_SIZE);
 	memcpy(to + offset, from, len);
+	flush_dcache_page(page);
 	kunmap_local(to);
 }
 
@@ -325,6 +326,7 @@ static inline void memzero_page(struct page *page, size_t offset, size_t len)
 {
 	char *addr = kmap_atomic(page);
 	memset(addr + offset, 0, len);
+	flush_dcache_page(page);
 	kunmap_atomic(addr);
 }
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] mm: use kmap_local_page in memzero_page
  2021-07-13  5:52 fix memcpy_to_page and memzero_page Christoph Hellwig
  2021-07-13  5:52 ` [PATCH 1/2] mm: call flush_dcache_page in " Christoph Hellwig
@ 2021-07-13  5:52 ` Christoph Hellwig
  1 sibling, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2021-07-13  5:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Ira Weiny, linux-kernel, linux-mm, Chaitanya Kulkarni

The commit message introducing the global memzero_page explicitly
mentions switching to kmap_local_page in the commit log but doesn't
actually do that.

Fixes: 28961998f858 ("iov_iter: lift memzero_page() to highmem.h")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
---
 include/linux/highmem.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 8e7e50a53a12..d9a606a9fc64 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -324,10 +324,10 @@ static inline void memcpy_to_page(struct page *page, size_t offset,
 
 static inline void memzero_page(struct page *page, size_t offset, size_t len)
 {
-	char *addr = kmap_atomic(page);
+	char *addr = kmap_local_page(page);
 	memset(addr + offset, 0, len);
 	flush_dcache_page(page);
-	kunmap_atomic(addr);
+	kunmap_local(addr);
 }
 
 #endif /* _LINUX_HIGHMEM_H */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] mm: call flush_dcache_page in memcpy_to_page and memzero_page
  2021-07-13  5:52 ` [PATCH 1/2] mm: call flush_dcache_page in " Christoph Hellwig
@ 2021-07-14  1:31   ` Andrew Morton
  2021-07-14  5:28     ` Christoph Hellwig
  2021-07-14  8:09   ` Ira Weiny
  1 sibling, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2021-07-14  1:31 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Ira Weiny, linux-kernel, linux-mm

On Tue, 13 Jul 2021 07:52:30 +0200 Christoph Hellwig <hch@lst.de> wrote:

> memcpy_to_page and memzero_page can write to arbitrary pages, which could
> be in the page cache or in high memory, so  call flush_kernel_dcache_pages
> to flush the dcache.

I assume this presently is not known to cause any problems, but that
some problems might be discovered in the future?  In which case,
should we cc:stable?


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] mm: call flush_dcache_page in memcpy_to_page and memzero_page
  2021-07-14  1:31   ` Andrew Morton
@ 2021-07-14  5:28     ` Christoph Hellwig
  0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2021-07-14  5:28 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Christoph Hellwig, Ira Weiny, linux-kernel, linux-mm

On Tue, Jul 13, 2021 at 06:31:23PM -0700, Andrew Morton wrote:
> On Tue, 13 Jul 2021 07:52:30 +0200 Christoph Hellwig <hch@lst.de> wrote:
> 
> > memcpy_to_page and memzero_page can write to arbitrary pages, which could
> > be in the page cache or in high memory, so  call flush_kernel_dcache_pages
> > to flush the dcache.
> 
> I assume this presently is not known to cause any problems, but that
> some problems might be discovered in the future?  In which case,
> should we cc:stable?

This is a problem when using these helpers on dcache challeneged
architectures.  Right now there are just a few users, chances
are no one used the PC floppy drіver, the aha1542 driver for an ISA
SCSI HBA, and a few advanced and optional btrfs and ext4 features
on those platforms yet since the conversion.  So yes, stable would be
good.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] mm: call flush_dcache_page in memcpy_to_page and memzero_page
  2021-07-13  5:52 ` [PATCH 1/2] mm: call flush_dcache_page in " Christoph Hellwig
  2021-07-14  1:31   ` Andrew Morton
@ 2021-07-14  8:09   ` Ira Weiny
  1 sibling, 0 replies; 6+ messages in thread
From: Ira Weiny @ 2021-07-14  8:09 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Andrew Morton, linux-kernel, linux-mm

On Tue, Jul 13, 2021 at 07:52:30AM +0200, Christoph Hellwig wrote:
> memcpy_to_page and memzero_page can write to arbitrary pages, which could
> be in the page cache or in high memory, so  call flush_kernel_dcache_pages
> to flush the dcache.
> 
> Fixes: bb90d4bc7b6a ("mm/highmem: Lift memcpy_[to|from]_page to core")
> Fixes: 28961998f858 ("iov_iter: lift memzero_page() to highmem.h")
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Ira Weiny <ira.weiny@intel.com>

> ---
>  include/linux/highmem.h | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/include/linux/highmem.h b/include/linux/highmem.h
> index 8c6e8e996c87..8e7e50a53a12 100644
> --- a/include/linux/highmem.h
> +++ b/include/linux/highmem.h
> @@ -318,6 +318,7 @@ static inline void memcpy_to_page(struct page *page, size_t offset,
>  
>  	VM_BUG_ON(offset + len > PAGE_SIZE);
>  	memcpy(to + offset, from, len);
> +	flush_dcache_page(page);
>  	kunmap_local(to);
>  }
>  
> @@ -325,6 +326,7 @@ static inline void memzero_page(struct page *page, size_t offset, size_t len)
>  {
>  	char *addr = kmap_atomic(page);
>  	memset(addr + offset, 0, len);
> +	flush_dcache_page(page);
>  	kunmap_atomic(addr);
>  }
>  
> -- 
> 2.30.2
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-07-14  8:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-13  5:52 fix memcpy_to_page and memzero_page Christoph Hellwig
2021-07-13  5:52 ` [PATCH 1/2] mm: call flush_dcache_page in " Christoph Hellwig
2021-07-14  1:31   ` Andrew Morton
2021-07-14  5:28     ` Christoph Hellwig
2021-07-14  8:09   ` Ira Weiny
2021-07-13  5:52 ` [PATCH 2/2] mm: use kmap_local_page in memzero_page Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).