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@xxxxxxxxxxxxxxxxxxxx> > Suggested-by: David Sterba <dsterba@xxxxxxx> > Suggested-by: Ira Weiny <ira.weiny@xxxxxxxxx> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@xxxxxxxxx> > --- > > 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@xxxxxxxxx> > > 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 > >