linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND PATCH v4 0/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c
@ 2022-06-16 21:00 Fabio M. De Francesco
  2022-06-16 21:00 ` [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *" Fabio M. De Francesco
  2022-06-16 21:00 ` [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
  0 siblings, 2 replies; 8+ messages in thread
From: Fabio M. De Francesco @ 2022-06-16 21:00 UTC (permalink / raw)
  To: David Sterba
  Cc: Chris Mason, Josef Bacik, Nick Terrell, linux-btrfs,
	linux-kernel, Ira Weiny, Andrew Morton, Matthew Wilcox,
	Kees Cook, Sebastian Andrzej Siewior, James E . J . Bottomley,
	Helge Deller, John David Anglin, linux-parisc,
	Fabio M. De Francesco

This is a little series which serves the purpose to replace kmap() with
kmap_local_page() in btrfs/zstd.c. Actually this task is only
accomplished in patch 2/2.

Instead patch 1/2 is a pre-requisite for the above-mentioned replacement,
but, above all else, it has the purpose to conform the prototypes of
__kunmap_{local,atomic}() to their own correct semantic. Since those
functions don't make changes to the memory pointed by their arguments,
change the type of those arguments to become pointers to const void.

This little series has version number 4, despite it's the first time the
two component patches have been re-united in a series. This may be a
questionable choice, however patch 1/2 should be at its v4 and patch 2/2
should be at its v3. I've tried to preserve the logs of version changes.

v4 is due to the fact that, when I sent v3, I forgot to Cc several people
and mailing lists. Furthermore, Andrew M. made me notice that I've made
confusion with the tree structure: this is why now I have to send this
series again.

I want to apologize for the noise to people who have received these two
patches more times than it should have been.

Fabio M. De Francesco (2):
  highmem: Make __kunmap_{local,atomic}() take "const void *"
  btrfs: Replace kmap() with kmap_local_page() in zstd.c

 arch/parisc/include/asm/cacheflush.h |  6 ++--
 arch/parisc/kernel/cache.c           |  2 +-
 fs/btrfs/zstd.c                      | 42 +++++++++++++++-------------
 include/linux/highmem-internal.h     | 10 +++----
 mm/highmem.c                         |  2 +-
 5 files changed, 33 insertions(+), 29 deletions(-)

-- 
2.36.1


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

* [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *"
  2022-06-16 21:00 [RESEND PATCH v4 0/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
@ 2022-06-16 21:00 ` Fabio M. De Francesco
  2022-06-27 17:02   ` Fabio M. De Francesco
  2022-06-16 21:00 ` [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
  1 sibling, 1 reply; 8+ messages in thread
From: Fabio M. De Francesco @ 2022-06-16 21:00 UTC (permalink / raw)
  To: David Sterba
  Cc: Chris Mason, Josef Bacik, Nick Terrell, linux-btrfs,
	linux-kernel, Ira Weiny, Andrew Morton, Matthew Wilcox,
	Kees Cook, Sebastian Andrzej Siewior, James E . J . Bottomley,
	Helge Deller, John David Anglin, linux-parisc,
	Fabio M. De Francesco, David Sterba

__kunmap_ {local,atomic}() currently take pointers to void. However, this
is semantically incorrect, since these functions do not change the memory
their arguments point to.

Therefore, make this semantics explicit by modifying the prototypes of
__kunmap_{local,atomic}() to take pointers to const void.

As a side effect, compilers will likely produce more efficient code.

Cc: Andrew Morton <akpm@linux-foundation.org>
Suggested-by: David Sterba <dsterba@suse.cz>
Suggested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
---

v3->v4: Cc Maintainers and mailing lists I had overlooked when I sent v3.

v2->v3: Fix compilation errors for ARCH=parisc.
        Reported-by: kernel test robot <lkp@intel.com>

v1->v2: Change the commit message to clearly explain why these functions
        should require pointers to const void. The fundamental argument
        behind the commit message changes is semantic correctness.
        Obviously, there are no changes to the code.
        Many thanks to David Sterba and Ira Weiny for suggestions and
        reviews.

 arch/parisc/include/asm/cacheflush.h |  6 +++---
 arch/parisc/kernel/cache.c           |  2 +-
 include/linux/highmem-internal.h     | 10 +++++-----
 mm/highmem.c                         |  2 +-
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h
index 8d03b3b26229..0bdee6724132 100644
--- a/arch/parisc/include/asm/cacheflush.h
+++ b/arch/parisc/include/asm/cacheflush.h
@@ -22,7 +22,7 @@ void flush_kernel_icache_range_asm(unsigned long, unsigned long);
 void flush_user_dcache_range_asm(unsigned long, unsigned long);
 void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
 void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
-void flush_kernel_dcache_page_asm(void *);
+void flush_kernel_dcache_page_asm(const void *addr);
 void flush_kernel_icache_page(void *);
 
 /* Cache flush operations */
@@ -31,7 +31,7 @@ void flush_cache_all_local(void);
 void flush_cache_all(void);
 void flush_cache_mm(struct mm_struct *mm);
 
-void flush_kernel_dcache_page_addr(void *addr);
+void flush_kernel_dcache_page_addr(const void *addr);
 
 #define flush_kernel_dcache_range(start,size) \
 	flush_kernel_dcache_range_asm((start), (start)+(size));
@@ -75,7 +75,7 @@ void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
 void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
 
 #define ARCH_HAS_FLUSH_ON_KUNMAP
-static inline void kunmap_flush_on_unmap(void *addr)
+static inline void kunmap_flush_on_unmap(const void *addr)
 {
 	flush_kernel_dcache_page_addr(addr);
 }
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
index c8a11fcecf4c..824064cafd61 100644
--- a/arch/parisc/kernel/cache.c
+++ b/arch/parisc/kernel/cache.c
@@ -549,7 +549,7 @@ extern void purge_kernel_dcache_page_asm(unsigned long);
 extern void clear_user_page_asm(void *, unsigned long);
 extern void copy_user_page_asm(void *, void *, unsigned long);
 
-void flush_kernel_dcache_page_addr(void *addr)
+void flush_kernel_dcache_page_addr(const void *addr)
 {
 	unsigned long flags;
 
diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-internal.h
index cddb42ff0473..034b1106d022 100644
--- a/include/linux/highmem-internal.h
+++ b/include/linux/highmem-internal.h
@@ -8,7 +8,7 @@
 #ifdef CONFIG_KMAP_LOCAL
 void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot);
 void *__kmap_local_page_prot(struct page *page, pgprot_t prot);
-void kunmap_local_indexed(void *vaddr);
+void kunmap_local_indexed(const void *vaddr);
 void kmap_local_fork(struct task_struct *tsk);
 void __kmap_local_sched_out(void);
 void __kmap_local_sched_in(void);
@@ -89,7 +89,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
 	return __kmap_local_pfn_prot(pfn, kmap_prot);
 }
 
-static inline void __kunmap_local(void *vaddr)
+static inline void __kunmap_local(const void *vaddr)
 {
 	kunmap_local_indexed(vaddr);
 }
@@ -121,7 +121,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
 	return __kmap_local_pfn_prot(pfn, kmap_prot);
 }
 
-static inline void __kunmap_atomic(void *addr)
+static inline void __kunmap_atomic(const void *addr)
 {
 	kunmap_local_indexed(addr);
 	pagefault_enable();
@@ -197,7 +197,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
 	return kmap_local_page(pfn_to_page(pfn));
 }
 
-static inline void __kunmap_local(void *addr)
+static inline void __kunmap_local(const void *addr)
 {
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
 	kunmap_flush_on_unmap(addr);
@@ -224,7 +224,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
 	return kmap_atomic(pfn_to_page(pfn));
 }
 
-static inline void __kunmap_atomic(void *addr)
+static inline void __kunmap_atomic(const void *addr)
 {
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
 	kunmap_flush_on_unmap(addr);
diff --git a/mm/highmem.c b/mm/highmem.c
index 1a692997fac4..e32083e4ce0d 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -561,7 +561,7 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot)
 }
 EXPORT_SYMBOL(__kmap_local_page_prot);
 
-void kunmap_local_indexed(void *vaddr)
+void kunmap_local_indexed(const void *vaddr)
 {
 	unsigned long addr = (unsigned long) vaddr & PAGE_MASK;
 	pte_t *kmap_pte;
-- 
2.36.1


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

* [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c
  2022-06-16 21:00 [RESEND PATCH v4 0/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
  2022-06-16 21:00 ` [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *" Fabio M. De Francesco
@ 2022-06-16 21:00 ` Fabio M. De Francesco
  2022-07-01 17:19   ` Ira Weiny
  1 sibling, 1 reply; 8+ messages in thread
From: Fabio M. De Francesco @ 2022-06-16 21:00 UTC (permalink / raw)
  To: David Sterba
  Cc: Chris Mason, Josef Bacik, Nick Terrell, linux-btrfs,
	linux-kernel, Ira Weiny, Andrew Morton, Matthew Wilcox,
	Kees Cook, Sebastian Andrzej Siewior, James E . J . Bottomley,
	Helge Deller, John David Anglin, linux-parisc,
	Fabio M. De Francesco, Filipe Manana

The use of kmap() is being deprecated in favor of kmap_local_page(). With
kmap_local_page(), the mapping is per thread, CPU local and not globally
visible.

Therefore, use kmap_local_page() / kunmap_local() in zstd.c because in
this file the mappings are per thread and are not visible in other
contexts; meanwhile refactor zstd_compress_pages() to comply with the
ordering rules about nested local mapping / unmapping.

Tested with xfstests on QEMU + KVM 32 bits VM with 4GB of RAM and
HIGHMEM64G enabled. These changes passed all the tests of the group
"compress".

Cc: Filipe Manana <fdmanana@kernel.org>
Suggested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
---

v3->v4: Cc Maintainers and lists that had been overlooked when v3 was
        sent (mostly regarding patch 1/2).

v2->v3: Remove unnecessary casts to arguments of kunmap_local() now that
        this API can take pointers to const void.

v1->v2: No changes.

Thanks to Ira Weiny for his invaluable help and persevering support.
Thanks also to Filipe Manana for identifying a fundamental detail I had
overlooked in RFC:
https://lore.kernel.org/lkml/20220611093411.GA3779054@falcondesktop/

 fs/btrfs/zstd.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
index 0fe31a6f6e68..5d2ab0bac9d2 100644
--- a/fs/btrfs/zstd.c
+++ b/fs/btrfs/zstd.c
@@ -391,6 +391,8 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 	*out_pages = 0;
 	*total_out = 0;
 	*total_in = 0;
+	workspace->in_buf.src = NULL;
+	workspace->out_buf.dst = NULL;
 
 	/* Initialize the stream */
 	stream = zstd_init_cstream(&params, len, workspace->mem,
@@ -403,7 +405,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 
 	/* map in the first page of input data */
 	in_page = find_get_page(mapping, start >> PAGE_SHIFT);
-	workspace->in_buf.src = kmap(in_page);
+	workspace->in_buf.src = kmap_local_page(in_page);
 	workspace->in_buf.pos = 0;
 	workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
 
@@ -415,7 +417,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 		goto out;
 	}
 	pages[nr_pages++] = out_page;
-	workspace->out_buf.dst = kmap(out_page);
+	workspace->out_buf.dst = kmap_local_page(out_page);
 	workspace->out_buf.pos = 0;
 	workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
 
@@ -450,9 +452,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 		if (workspace->out_buf.pos == workspace->out_buf.size) {
 			tot_out += PAGE_SIZE;
 			max_out -= PAGE_SIZE;
-			kunmap(out_page);
+			kunmap_local(workspace->out_buf.dst);
 			if (nr_pages == nr_dest_pages) {
-				out_page = NULL;
+				workspace->out_buf.dst = NULL;
 				ret = -E2BIG;
 				goto out;
 			}
@@ -462,7 +464,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 				goto out;
 			}
 			pages[nr_pages++] = out_page;
-			workspace->out_buf.dst = kmap(out_page);
+			workspace->out_buf.dst = kmap_local_page(out_page);
 			workspace->out_buf.pos = 0;
 			workspace->out_buf.size = min_t(size_t, max_out,
 							PAGE_SIZE);
@@ -477,15 +479,16 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 		/* Check if we need more input */
 		if (workspace->in_buf.pos == workspace->in_buf.size) {
 			tot_in += PAGE_SIZE;
-			kunmap(in_page);
+			kunmap_local(workspace->out_buf.dst);
+			kunmap_local(workspace->in_buf.src);
 			put_page(in_page);
-
 			start += PAGE_SIZE;
 			len -= PAGE_SIZE;
 			in_page = find_get_page(mapping, start >> PAGE_SHIFT);
-			workspace->in_buf.src = kmap(in_page);
+			workspace->in_buf.src = kmap_local_page(in_page);
 			workspace->in_buf.pos = 0;
 			workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
+			workspace->out_buf.dst = kmap_local_page(out_page);
 		}
 	}
 	while (1) {
@@ -510,9 +513,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 
 		tot_out += PAGE_SIZE;
 		max_out -= PAGE_SIZE;
-		kunmap(out_page);
+		kunmap_local(workspace->out_buf.dst);
 		if (nr_pages == nr_dest_pages) {
-			out_page = NULL;
+			workspace->out_buf.dst = NULL;
 			ret = -E2BIG;
 			goto out;
 		}
@@ -522,7 +525,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 			goto out;
 		}
 		pages[nr_pages++] = out_page;
-		workspace->out_buf.dst = kmap(out_page);
+		workspace->out_buf.dst = kmap_local_page(out_page);
 		workspace->out_buf.pos = 0;
 		workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
 	}
@@ -538,12 +541,12 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
 out:
 	*out_pages = nr_pages;
 	/* Cleanup */
-	if (in_page) {
-		kunmap(in_page);
+	if (workspace->out_buf.dst)
+		kunmap_local(workspace->out_buf.dst);
+	if (workspace->in_buf.src) {
+		kunmap_local(workspace->in_buf.src);
 		put_page(in_page);
 	}
-	if (out_page)
-		kunmap(out_page);
 	return ret;
 }
 
@@ -567,7 +570,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
 		goto done;
 	}
 
-	workspace->in_buf.src = kmap(pages_in[page_in_index]);
+	workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
 	workspace->in_buf.pos = 0;
 	workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
 
@@ -603,14 +606,15 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
 			break;
 
 		if (workspace->in_buf.pos == workspace->in_buf.size) {
-			kunmap(pages_in[page_in_index++]);
+			kunmap_local(workspace->in_buf.src);
+			page_in_index++;
 			if (page_in_index >= total_pages_in) {
 				workspace->in_buf.src = NULL;
 				ret = -EIO;
 				goto done;
 			}
 			srclen -= PAGE_SIZE;
-			workspace->in_buf.src = kmap(pages_in[page_in_index]);
+			workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
 			workspace->in_buf.pos = 0;
 			workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
 		}
@@ -619,7 +623,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
 	zero_fill_bio(cb->orig_bio);
 done:
 	if (workspace->in_buf.src)
-		kunmap(pages_in[page_in_index]);
+		kunmap_local(workspace->in_buf.src);
 	return ret;
 }
 
-- 
2.36.1


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

* Re: [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *"
  2022-06-16 21:00 ` [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *" Fabio M. De Francesco
@ 2022-06-27 17:02   ` Fabio M. De Francesco
  2022-06-27 18:19     ` Andrew Morton
  0 siblings, 1 reply; 8+ messages in thread
From: Fabio M. De Francesco @ 2022-06-27 17:02 UTC (permalink / raw)
  To: David Sterba, Andrew Morton
  Cc: Chris Mason, Josef Bacik, Nick Terrell, linux-btrfs,
	linux-kernel, Ira Weiny, Matthew Wilcox, Kees Cook,
	Sebastian Andrzej Siewior, James E . J . Bottomley, Helge Deller,
	John David Anglin, linux-parisc, David Sterba

On giovedì 16 giugno 2022 23:00:35 CEST Fabio M. De Francesco wrote:
> __kunmap_ {local,atomic}() currently take pointers to void. However, this
> is semantically incorrect, since these functions do not change the memory
> their arguments point to.
> 
> Therefore, make this semantics explicit by modifying the prototypes of
> __kunmap_{local,atomic}() to take pointers to const void.
> 
> As a side effect, compilers will likely produce more efficient code.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Suggested-by: David Sterba <dsterba@suse.cz>
> Suggested-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> ---
> 
> v3->v4: Cc Maintainers and mailing lists I had overlooked when I sent v3.
> 
> v2->v3: Fix compilation errors for ARCH=parisc.
>         Reported-by: kernel test robot <lkp@intel.com>
> 
> v1->v2: Change the commit message to clearly explain why these functions
>         should require pointers to const void. The fundamental argument
>         behind the commit message changes is semantic correctness.
>         Obviously, there are no changes to the code.
>         Many thanks to David Sterba and Ira Weiny for suggestions and
>         reviews.
>
>  arch/parisc/include/asm/cacheflush.h |  6 +++---
>  arch/parisc/kernel/cache.c           |  2 +-
>  include/linux/highmem-internal.h     | 10 +++++-----
>  mm/highmem.c                         |  2 +-
>  4 files changed, 10 insertions(+), 10 deletions(-)

@Andrew:

Ira Weiny asked David Sterba for taking this patch through his tree because 
it is a pre-requisite for a patch to fs/btrfs. He agreed with the above-
mentioned suggestion, however I suppose that an ACK by you is needed.

Can you please take a look at this patch and say what you think about it?

Thanks,

Fabio

> 
> diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/
asm/cacheflush.h
> index 8d03b3b26229..0bdee6724132 100644
> --- a/arch/parisc/include/asm/cacheflush.h
> +++ b/arch/parisc/include/asm/cacheflush.h
> @@ -22,7 +22,7 @@ void flush_kernel_icache_range_asm(unsigned long, 
unsigned long);
>  void flush_user_dcache_range_asm(unsigned long, unsigned long);
>  void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
>  void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
> -void flush_kernel_dcache_page_asm(void *);
> +void flush_kernel_dcache_page_asm(const void *addr);
>  void flush_kernel_icache_page(void *);
>  
>  /* Cache flush operations */
> @@ -31,7 +31,7 @@ void flush_cache_all_local(void);
>  void flush_cache_all(void);
>  void flush_cache_mm(struct mm_struct *mm);
>  
> -void flush_kernel_dcache_page_addr(void *addr);
> +void flush_kernel_dcache_page_addr(const void *addr);
>  
>  #define flush_kernel_dcache_range(start,size) \
>  	flush_kernel_dcache_range_asm((start), (start)+(size));
> @@ -75,7 +75,7 @@ void flush_dcache_page_asm(unsigned long phys_addr, 
unsigned long vaddr);
>  void flush_anon_page(struct vm_area_struct *vma, struct page *page, 
unsigned long vmaddr);
>  
>  #define ARCH_HAS_FLUSH_ON_KUNMAP
> -static inline void kunmap_flush_on_unmap(void *addr)
> +static inline void kunmap_flush_on_unmap(const void *addr)
>  {
>  	flush_kernel_dcache_page_addr(addr);
>  }
> diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
> index c8a11fcecf4c..824064cafd61 100644
> --- a/arch/parisc/kernel/cache.c
> +++ b/arch/parisc/kernel/cache.c
> @@ -549,7 +549,7 @@ extern void purge_kernel_dcache_page_asm(unsigned 
long);
>  extern void clear_user_page_asm(void *, unsigned long);
>  extern void copy_user_page_asm(void *, void *, unsigned long);
>  
> -void flush_kernel_dcache_page_addr(void *addr)
> +void flush_kernel_dcache_page_addr(const void *addr)
>  {
>  	unsigned long flags;
>  
> diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-
internal.h
> index cddb42ff0473..034b1106d022 100644
> --- a/include/linux/highmem-internal.h
> +++ b/include/linux/highmem-internal.h
> @@ -8,7 +8,7 @@
>  #ifdef CONFIG_KMAP_LOCAL
>  void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot);
>  void *__kmap_local_page_prot(struct page *page, pgprot_t prot);
> -void kunmap_local_indexed(void *vaddr);
> +void kunmap_local_indexed(const void *vaddr);
>  void kmap_local_fork(struct task_struct *tsk);
>  void __kmap_local_sched_out(void);
>  void __kmap_local_sched_in(void);
> @@ -89,7 +89,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
>  	return __kmap_local_pfn_prot(pfn, kmap_prot);
>  }
>  
> -static inline void __kunmap_local(void *vaddr)
> +static inline void __kunmap_local(const void *vaddr)
>  {
>  	kunmap_local_indexed(vaddr);
>  }
> @@ -121,7 +121,7 @@ static inline void *kmap_atomic_pfn(unsigned long 
pfn)
>  	return __kmap_local_pfn_prot(pfn, kmap_prot);
>  }
>  
> -static inline void __kunmap_atomic(void *addr)
> +static inline void __kunmap_atomic(const void *addr)
>  {
>  	kunmap_local_indexed(addr);
>  	pagefault_enable();
> @@ -197,7 +197,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
>  	return kmap_local_page(pfn_to_page(pfn));
>  }
>  
> -static inline void __kunmap_local(void *addr)
> +static inline void __kunmap_local(const void *addr)
>  {
>  #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
>  	kunmap_flush_on_unmap(addr);
> @@ -224,7 +224,7 @@ static inline void *kmap_atomic_pfn(unsigned long 
pfn)
>  	return kmap_atomic(pfn_to_page(pfn));
>  }
>  
> -static inline void __kunmap_atomic(void *addr)
> +static inline void __kunmap_atomic(const void *addr)
>  {
>  #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
>  	kunmap_flush_on_unmap(addr);
> diff --git a/mm/highmem.c b/mm/highmem.c
> index 1a692997fac4..e32083e4ce0d 100644
> --- a/mm/highmem.c
> +++ b/mm/highmem.c
> @@ -561,7 +561,7 @@ void *__kmap_local_page_prot(struct page *page, 
pgprot_t prot)
>  }
>  EXPORT_SYMBOL(__kmap_local_page_prot);
>  
> -void kunmap_local_indexed(void *vaddr)
> +void kunmap_local_indexed(const void *vaddr)
>  {
>  	unsigned long addr = (unsigned long) vaddr & PAGE_MASK;
>  	pte_t *kmap_pte;
> -- 
> 2.36.1
> 
> 





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

* Re: [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *"
  2022-06-27 17:02   ` Fabio M. De Francesco
@ 2022-06-27 18:19     ` Andrew Morton
  2022-06-28 14:46       ` Fabio M. De Francesco
  0 siblings, 1 reply; 8+ messages in thread
From: Andrew Morton @ 2022-06-27 18:19 UTC (permalink / raw)
  To: Fabio M. De Francesco
  Cc: David Sterba, Chris Mason, Josef Bacik, Nick Terrell,
	linux-btrfs, linux-kernel, Ira Weiny, Matthew Wilcox, Kees Cook,
	Sebastian Andrzej Siewior, James E . J . Bottomley, Helge Deller,
	John David Anglin, linux-parisc, David Sterba

On Mon, 27 Jun 2022 19:02:31 +0200 "Fabio M. De Francesco" <fmdefrancesco@gmail.com> wrote:

> > v1->v2: Change the commit message to clearly explain why these functions
> >         should require pointers to const void. The fundamental argument
> >         behind the commit message changes is semantic correctness.
> >         Obviously, there are no changes to the code.
> >         Many thanks to David Sterba and Ira Weiny for suggestions and
> >         reviews.
> >
> >  arch/parisc/include/asm/cacheflush.h |  6 +++---
> >  arch/parisc/kernel/cache.c           |  2 +-
> >  include/linux/highmem-internal.h     | 10 +++++-----
> >  mm/highmem.c                         |  2 +-
> >  4 files changed, 10 insertions(+), 10 deletions(-)
> 
> @Andrew:
> 
> Ira Weiny asked David Sterba for taking this patch through his tree because 
> it is a pre-requisite for a patch to fs/btrfs. He agreed with the above-
> mentioned suggestion, however I suppose that an ACK by you is needed.
> 
> Can you please take a look at this patch and say what you think about it?

Looks OK to me.  It's one of those "if it compiles, it's good" things.

I don't believe the patch has ever appeared on linux-mm?  Please send
it there for some review then go ahead and merge it up.


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

* [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *"
  2022-06-27 18:19     ` Andrew Morton
@ 2022-06-28 14:46       ` Fabio M. De Francesco
  2022-07-01 17:08         ` Ira Weiny
  0 siblings, 1 reply; 8+ messages in thread
From: Fabio M. De Francesco @ 2022-06-28 14:46 UTC (permalink / raw)
  To: David Sterba, Chris Mason, Josef Bacik, Nick Terrell,
	linux-btrfs, linux-mm, linux-kernel, Ira Weiny, Andrew Morton,
	Matthew Wilcox, Kees Cook, Sebastian Andrzej Siewior,
	James E. J. Bottomley, Helge Deller, John David Anglin,
	linux-parisc
  Cc: Fabio M. De Francesco, David Sterba

__kunmap_ {local,atomic}() currently take pointers to void. However, this
is semantically incorrect, since these functions do not change the memory
their arguments point to.

Therefore, make this semantics explicit by modifying the
__kunmap_{local,atomic}() prototypes to take pointers to const void.

As a side effect, compilers will likely produce more efficient code.

Cc: Andrew Morton <akpm@linux-foundation.org>
Suggested-by: David Sterba <dsterba@suse.cz>
Suggested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
---

This is a resend of the same patch CC'ed to linux-mm.

v3->v4: Cc Maintainers and mailing lists I had overlooked when I sent v3.

v2->v3: Fix compilation errors for ARCH=parisc.
        Reported-by: kernel test robot <lkp@intel.com>

v1->v2: Change the commit message to clearly explain why these functions
        should require pointers to const void. The fundamental argument
        behind the commit message changes is semantic correctness.
        Obviously, there are no changes to the code.
        Many thanks to David Sterba and Ira Weiny for suggestions and
        reviews.

 arch/parisc/include/asm/cacheflush.h |  6 +++---
 arch/parisc/kernel/cache.c           |  2 +-
 include/linux/highmem-internal.h     | 10 +++++-----
 mm/highmem.c                         |  2 +-
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h
index 8d03b3b26229..0bdee6724132 100644
--- a/arch/parisc/include/asm/cacheflush.h
+++ b/arch/parisc/include/asm/cacheflush.h
@@ -22,7 +22,7 @@ void flush_kernel_icache_range_asm(unsigned long, unsigned long);
 void flush_user_dcache_range_asm(unsigned long, unsigned long);
 void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
 void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
-void flush_kernel_dcache_page_asm(void *);
+void flush_kernel_dcache_page_asm(const void *addr);
 void flush_kernel_icache_page(void *);
 
 /* Cache flush operations */
@@ -31,7 +31,7 @@ void flush_cache_all_local(void);
 void flush_cache_all(void);
 void flush_cache_mm(struct mm_struct *mm);
 
-void flush_kernel_dcache_page_addr(void *addr);
+void flush_kernel_dcache_page_addr(const void *addr);
 
 #define flush_kernel_dcache_range(start,size) \
 	flush_kernel_dcache_range_asm((start), (start)+(size));
@@ -75,7 +75,7 @@ void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
 void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
 
 #define ARCH_HAS_FLUSH_ON_KUNMAP
-static inline void kunmap_flush_on_unmap(void *addr)
+static inline void kunmap_flush_on_unmap(const void *addr)
 {
 	flush_kernel_dcache_page_addr(addr);
 }
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
index a9bc578e4c52..993999a65e54 100644
--- a/arch/parisc/kernel/cache.c
+++ b/arch/parisc/kernel/cache.c
@@ -549,7 +549,7 @@ extern void purge_kernel_dcache_page_asm(unsigned long);
 extern void clear_user_page_asm(void *, unsigned long);
 extern void copy_user_page_asm(void *, void *, unsigned long);
 
-void flush_kernel_dcache_page_addr(void *addr)
+void flush_kernel_dcache_page_addr(const void *addr)
 {
 	unsigned long flags;
 
diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-internal.h
index cddb42ff0473..034b1106d022 100644
--- a/include/linux/highmem-internal.h
+++ b/include/linux/highmem-internal.h
@@ -8,7 +8,7 @@
 #ifdef CONFIG_KMAP_LOCAL
 void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot);
 void *__kmap_local_page_prot(struct page *page, pgprot_t prot);
-void kunmap_local_indexed(void *vaddr);
+void kunmap_local_indexed(const void *vaddr);
 void kmap_local_fork(struct task_struct *tsk);
 void __kmap_local_sched_out(void);
 void __kmap_local_sched_in(void);
@@ -89,7 +89,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
 	return __kmap_local_pfn_prot(pfn, kmap_prot);
 }
 
-static inline void __kunmap_local(void *vaddr)
+static inline void __kunmap_local(const void *vaddr)
 {
 	kunmap_local_indexed(vaddr);
 }
@@ -121,7 +121,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
 	return __kmap_local_pfn_prot(pfn, kmap_prot);
 }
 
-static inline void __kunmap_atomic(void *addr)
+static inline void __kunmap_atomic(const void *addr)
 {
 	kunmap_local_indexed(addr);
 	pagefault_enable();
@@ -197,7 +197,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
 	return kmap_local_page(pfn_to_page(pfn));
 }
 
-static inline void __kunmap_local(void *addr)
+static inline void __kunmap_local(const void *addr)
 {
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
 	kunmap_flush_on_unmap(addr);
@@ -224,7 +224,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
 	return kmap_atomic(pfn_to_page(pfn));
 }
 
-static inline void __kunmap_atomic(void *addr)
+static inline void __kunmap_atomic(const void *addr)
 {
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
 	kunmap_flush_on_unmap(addr);
diff --git a/mm/highmem.c b/mm/highmem.c
index 1a692997fac4..e32083e4ce0d 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -561,7 +561,7 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot)
 }
 EXPORT_SYMBOL(__kmap_local_page_prot);
 
-void kunmap_local_indexed(void *vaddr)
+void kunmap_local_indexed(const void *vaddr)
 {
 	unsigned long addr = (unsigned long) vaddr & PAGE_MASK;
 	pte_t *kmap_pte;
-- 
2.36.1


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

* Re: [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *"
  2022-06-28 14:46       ` Fabio M. De Francesco
@ 2022-07-01 17:08         ` Ira Weiny
  0 siblings, 0 replies; 8+ messages in thread
From: Ira Weiny @ 2022-07-01 17:08 UTC (permalink / raw)
  To: Fabio M. De Francesco
  Cc: David Sterba, Chris Mason, Josef Bacik, Nick Terrell,
	linux-btrfs, linux-mm, linux-kernel, Andrew Morton,
	Matthew Wilcox, Kees Cook, Sebastian Andrzej Siewior,
	James E. J. Bottomley, Helge Deller, John David Anglin,
	linux-parisc, David Sterba

On Tue, Jun 28, 2022 at 04:46:49PM +0200, Fabio M. De Francesco wrote:
> __kunmap_ {local,atomic}() currently take pointers to void. However, this
> is semantically incorrect, since these functions do not change the memory
> their arguments point to.
> 
> Therefore, make this semantics explicit by modifying the
> __kunmap_{local,atomic}() prototypes to take pointers to const void.
> 
> As a side effect, compilers will likely produce more efficient code.
> 
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Suggested-by: David Sterba <dsterba@suse.cz>
> Suggested-by: Ira Weiny <ira.weiny@intel.com>

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

> Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> ---
> 
> This is a resend of the same patch CC'ed to linux-mm.
> 
> v3->v4: Cc Maintainers and mailing lists I had overlooked when I sent v3.
> 
> v2->v3: Fix compilation errors for ARCH=parisc.
>         Reported-by: kernel test robot <lkp@intel.com>
> 
> v1->v2: Change the commit message to clearly explain why these functions
>         should require pointers to const void. The fundamental argument
>         behind the commit message changes is semantic correctness.
>         Obviously, there are no changes to the code.
>         Many thanks to David Sterba and Ira Weiny for suggestions and
>         reviews.
> 
>  arch/parisc/include/asm/cacheflush.h |  6 +++---
>  arch/parisc/kernel/cache.c           |  2 +-
>  include/linux/highmem-internal.h     | 10 +++++-----
>  mm/highmem.c                         |  2 +-
>  4 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h
> index 8d03b3b26229..0bdee6724132 100644
> --- a/arch/parisc/include/asm/cacheflush.h
> +++ b/arch/parisc/include/asm/cacheflush.h
> @@ -22,7 +22,7 @@ void flush_kernel_icache_range_asm(unsigned long, unsigned long);
>  void flush_user_dcache_range_asm(unsigned long, unsigned long);
>  void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
>  void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
> -void flush_kernel_dcache_page_asm(void *);
> +void flush_kernel_dcache_page_asm(const void *addr);
>  void flush_kernel_icache_page(void *);
>  
>  /* Cache flush operations */
> @@ -31,7 +31,7 @@ void flush_cache_all_local(void);
>  void flush_cache_all(void);
>  void flush_cache_mm(struct mm_struct *mm);
>  
> -void flush_kernel_dcache_page_addr(void *addr);
> +void flush_kernel_dcache_page_addr(const void *addr);
>  
>  #define flush_kernel_dcache_range(start,size) \
>  	flush_kernel_dcache_range_asm((start), (start)+(size));
> @@ -75,7 +75,7 @@ void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
>  void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
>  
>  #define ARCH_HAS_FLUSH_ON_KUNMAP
> -static inline void kunmap_flush_on_unmap(void *addr)
> +static inline void kunmap_flush_on_unmap(const void *addr)
>  {
>  	flush_kernel_dcache_page_addr(addr);
>  }
> diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
> index a9bc578e4c52..993999a65e54 100644
> --- a/arch/parisc/kernel/cache.c
> +++ b/arch/parisc/kernel/cache.c
> @@ -549,7 +549,7 @@ extern void purge_kernel_dcache_page_asm(unsigned long);
>  extern void clear_user_page_asm(void *, unsigned long);
>  extern void copy_user_page_asm(void *, void *, unsigned long);
>  
> -void flush_kernel_dcache_page_addr(void *addr)
> +void flush_kernel_dcache_page_addr(const void *addr)
>  {
>  	unsigned long flags;
>  
> diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-internal.h
> index cddb42ff0473..034b1106d022 100644
> --- a/include/linux/highmem-internal.h
> +++ b/include/linux/highmem-internal.h
> @@ -8,7 +8,7 @@
>  #ifdef CONFIG_KMAP_LOCAL
>  void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot);
>  void *__kmap_local_page_prot(struct page *page, pgprot_t prot);
> -void kunmap_local_indexed(void *vaddr);
> +void kunmap_local_indexed(const void *vaddr);
>  void kmap_local_fork(struct task_struct *tsk);
>  void __kmap_local_sched_out(void);
>  void __kmap_local_sched_in(void);
> @@ -89,7 +89,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
>  	return __kmap_local_pfn_prot(pfn, kmap_prot);
>  }
>  
> -static inline void __kunmap_local(void *vaddr)
> +static inline void __kunmap_local(const void *vaddr)
>  {
>  	kunmap_local_indexed(vaddr);
>  }
> @@ -121,7 +121,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
>  	return __kmap_local_pfn_prot(pfn, kmap_prot);
>  }
>  
> -static inline void __kunmap_atomic(void *addr)
> +static inline void __kunmap_atomic(const void *addr)
>  {
>  	kunmap_local_indexed(addr);
>  	pagefault_enable();
> @@ -197,7 +197,7 @@ static inline void *kmap_local_pfn(unsigned long pfn)
>  	return kmap_local_page(pfn_to_page(pfn));
>  }
>  
> -static inline void __kunmap_local(void *addr)
> +static inline void __kunmap_local(const void *addr)
>  {
>  #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
>  	kunmap_flush_on_unmap(addr);
> @@ -224,7 +224,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn)
>  	return kmap_atomic(pfn_to_page(pfn));
>  }
>  
> -static inline void __kunmap_atomic(void *addr)
> +static inline void __kunmap_atomic(const void *addr)
>  {
>  #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
>  	kunmap_flush_on_unmap(addr);
> diff --git a/mm/highmem.c b/mm/highmem.c
> index 1a692997fac4..e32083e4ce0d 100644
> --- a/mm/highmem.c
> +++ b/mm/highmem.c
> @@ -561,7 +561,7 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot)
>  }
>  EXPORT_SYMBOL(__kmap_local_page_prot);
>  
> -void kunmap_local_indexed(void *vaddr)
> +void kunmap_local_indexed(const void *vaddr)
>  {
>  	unsigned long addr = (unsigned long) vaddr & PAGE_MASK;
>  	pte_t *kmap_pte;
> -- 
> 2.36.1
> 
> 

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

* Re: [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c
  2022-06-16 21:00 ` [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
@ 2022-07-01 17:19   ` Ira Weiny
  0 siblings, 0 replies; 8+ messages in thread
From: Ira Weiny @ 2022-07-01 17:19 UTC (permalink / raw)
  To: Fabio M. De Francesco
  Cc: David Sterba, Chris Mason, Josef Bacik, Nick Terrell,
	linux-btrfs, linux-kernel, Andrew Morton, Matthew Wilcox,
	Kees Cook, Sebastian Andrzej Siewior, James E . J . Bottomley,
	Helge Deller, John David Anglin, linux-parisc, Filipe Manana

On Thu, Jun 16, 2022 at 11:00:36PM +0200, Fabio M. De Francesco wrote:
> The use of kmap() is being deprecated in favor of kmap_local_page(). With
> kmap_local_page(), the mapping is per thread, CPU local and not globally
> visible.
> 
> Therefore, use kmap_local_page() / kunmap_local() in zstd.c because in
> this file the mappings are per thread and are not visible in other
> contexts; meanwhile refactor zstd_compress_pages() to comply with the
> ordering rules about nested local mapping / unmapping.
> 
> Tested with xfstests on QEMU + KVM 32 bits VM with 4GB of RAM and
> HIGHMEM64G enabled. These changes passed all the tests of the group
> "compress".
> 
> Cc: Filipe Manana <fdmanana@kernel.org>
> Suggested-by: Ira Weiny <ira.weiny@intel.com>
> Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
> ---
> 
> v3->v4: Cc Maintainers and lists that had been overlooked when v3 was
>         sent (mostly regarding patch 1/2).
> 
> v2->v3: Remove unnecessary casts to arguments of kunmap_local() now that
>         this API can take pointers to const void.
> 
> v1->v2: No changes.
> 
> Thanks to Ira Weiny for his invaluable help and persevering support.
> Thanks also to Filipe Manana for identifying a fundamental detail I had
> overlooked in RFC:
> https://lore.kernel.org/lkml/20220611093411.GA3779054@falcondesktop/
> 
>  fs/btrfs/zstd.c | 42 +++++++++++++++++++++++-------------------
>  1 file changed, 23 insertions(+), 19 deletions(-)
> 
> diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
> index 0fe31a6f6e68..5d2ab0bac9d2 100644
> --- a/fs/btrfs/zstd.c
> +++ b/fs/btrfs/zstd.c
> @@ -391,6 +391,8 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  	*out_pages = 0;
>  	*total_out = 0;
>  	*total_in = 0;
> +	workspace->in_buf.src = NULL;
> +	workspace->out_buf.dst = NULL;

I don't think either of these are needed as they are both set straight away
below.

>  
>  	/* Initialize the stream */
>  	stream = zstd_init_cstream(&params, len, workspace->mem,
> @@ -403,7 +405,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  
>  	/* map in the first page of input data */
>  	in_page = find_get_page(mapping, start >> PAGE_SHIFT);
> -	workspace->in_buf.src = kmap(in_page);
> +	workspace->in_buf.src = kmap_local_page(in_page);
>  	workspace->in_buf.pos = 0;
>  	workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
>  
> @@ -415,7 +417,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  		goto out;
>  	}
>  	pages[nr_pages++] = out_page;
> -	workspace->out_buf.dst = kmap(out_page);
> +	workspace->out_buf.dst = kmap_local_page(out_page);

Given the conversation in the other thread for zlib_compress_pages(); I think
we should also just use page_address() here.  That simplifies the algorithm
immensely.

I know there was a lot of thought put into how to make this conversion when
this was posted but that is now the cleaner solution.

Ira

>  	workspace->out_buf.pos = 0;
>  	workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
>  
> @@ -450,9 +452,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  		if (workspace->out_buf.pos == workspace->out_buf.size) {
>  			tot_out += PAGE_SIZE;
>  			max_out -= PAGE_SIZE;
> -			kunmap(out_page);
> +			kunmap_local(workspace->out_buf.dst);
>  			if (nr_pages == nr_dest_pages) {
> -				out_page = NULL;
> +				workspace->out_buf.dst = NULL;
>  				ret = -E2BIG;
>  				goto out;
>  			}
> @@ -462,7 +464,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  				goto out;
>  			}
>  			pages[nr_pages++] = out_page;
> -			workspace->out_buf.dst = kmap(out_page);
> +			workspace->out_buf.dst = kmap_local_page(out_page);
>  			workspace->out_buf.pos = 0;
>  			workspace->out_buf.size = min_t(size_t, max_out,
>  							PAGE_SIZE);
> @@ -477,15 +479,16 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  		/* Check if we need more input */
>  		if (workspace->in_buf.pos == workspace->in_buf.size) {
>  			tot_in += PAGE_SIZE;
> -			kunmap(in_page);
> +			kunmap_local(workspace->out_buf.dst);
> +			kunmap_local(workspace->in_buf.src);
>  			put_page(in_page);
> -
>  			start += PAGE_SIZE;
>  			len -= PAGE_SIZE;
>  			in_page = find_get_page(mapping, start >> PAGE_SHIFT);
> -			workspace->in_buf.src = kmap(in_page);
> +			workspace->in_buf.src = kmap_local_page(in_page);
>  			workspace->in_buf.pos = 0;
>  			workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
> +			workspace->out_buf.dst = kmap_local_page(out_page);
>  		}
>  	}
>  	while (1) {
> @@ -510,9 +513,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  
>  		tot_out += PAGE_SIZE;
>  		max_out -= PAGE_SIZE;
> -		kunmap(out_page);
> +		kunmap_local(workspace->out_buf.dst);
>  		if (nr_pages == nr_dest_pages) {
> -			out_page = NULL;
> +			workspace->out_buf.dst = NULL;
>  			ret = -E2BIG;
>  			goto out;
>  		}
> @@ -522,7 +525,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  			goto out;
>  		}
>  		pages[nr_pages++] = out_page;
> -		workspace->out_buf.dst = kmap(out_page);
> +		workspace->out_buf.dst = kmap_local_page(out_page);
>  		workspace->out_buf.pos = 0;
>  		workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
>  	}
> @@ -538,12 +541,12 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
>  out:
>  	*out_pages = nr_pages;
>  	/* Cleanup */
> -	if (in_page) {
> -		kunmap(in_page);
> +	if (workspace->out_buf.dst)
> +		kunmap_local(workspace->out_buf.dst);
> +	if (workspace->in_buf.src) {
> +		kunmap_local(workspace->in_buf.src);
>  		put_page(in_page);
>  	}
> -	if (out_page)
> -		kunmap(out_page);
>  	return ret;
>  }
>  
> @@ -567,7 +570,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
>  		goto done;
>  	}
>  
> -	workspace->in_buf.src = kmap(pages_in[page_in_index]);
> +	workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
>  	workspace->in_buf.pos = 0;
>  	workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
>  
> @@ -603,14 +606,15 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
>  			break;
>  
>  		if (workspace->in_buf.pos == workspace->in_buf.size) {
> -			kunmap(pages_in[page_in_index++]);
> +			kunmap_local(workspace->in_buf.src);
> +			page_in_index++;
>  			if (page_in_index >= total_pages_in) {
>  				workspace->in_buf.src = NULL;
>  				ret = -EIO;
>  				goto done;
>  			}
>  			srclen -= PAGE_SIZE;
> -			workspace->in_buf.src = kmap(pages_in[page_in_index]);
> +			workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
>  			workspace->in_buf.pos = 0;
>  			workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
>  		}
> @@ -619,7 +623,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
>  	zero_fill_bio(cb->orig_bio);
>  done:
>  	if (workspace->in_buf.src)
> -		kunmap(pages_in[page_in_index]);
> +		kunmap_local(workspace->in_buf.src);
>  	return ret;
>  }
>  
> -- 
> 2.36.1
> 

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

end of thread, other threads:[~2022-07-01 17:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-16 21:00 [RESEND PATCH v4 0/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
2022-06-16 21:00 ` [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *" Fabio M. De Francesco
2022-06-27 17:02   ` Fabio M. De Francesco
2022-06-27 18:19     ` Andrew Morton
2022-06-28 14:46       ` Fabio M. De Francesco
2022-07-01 17:08         ` Ira Weiny
2022-06-16 21:00 ` [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Fabio M. De Francesco
2022-07-01 17:19   ` Ira Weiny

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).