On Tue, Jun 14, 2022 at 04:25:31PM +0200, Fabio M. De Francesco wrote:
> Sometimes __kunmap_{local,atomic}() should take pointers to const void.
> Currently their prototypes take pointers to void, therefore compilations
> break in cases like the above-mentioned.
I think the compilation problem is just a symptom of the real issue.
kunmap_local() has no reason to change the vaddr parameter and therefore it is
correct to declare it a const.
This allows callers to also maintain vaddr as a const value to be passed back
to kumap_local() if they wish.
Ira
>
> This is the output of GCC-12 when it encounters one those cases:
>
> ./linux/fs/btrfs/zstd.c:547:33: warning: passing
> argument 1 of '__kunmap_local' discards 'const' qualifier from pointer
> target type [-Wdiscarded-qualifiers]
> 547 | kunmap_local(workspace->in_buf.src);
> | ~~~~~~~~~~~~~~~~~^~~~
> ./linux/include/linux/highmem-internal.h:284:17:
> note: in definition of macro 'kunmap_local'
> 284 | __kunmap_local(__addr); \
> | ^~~~~~
> ./linux/include/linux/highmem-internal.h:92:41:
> note: expected 'void *' but argument is of type 'const void *'
> 92 | static inline void __kunmap_local(void *vaddr)
> | ~~~~~~^~~~~
>
> Make __kunmap_{local,atomic}() take pointers to const void.
>
> Suggested-by: David Sterba <[email protected]>
> Suggested-by: Ira Weiny <[email protected]>
> Signed-off-by: Fabio M. De Francesco <[email protected]>
> ---
> include/linux/highmem-internal.h | 10 +++++-----
> mm/highmem.c | 2 +-
> 2 files changed, 6 insertions(+), 6 deletions(-)
>
> 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
>