Message ID | 20200507150004.1423069-14-ira.weiny@intel.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Remove duplicated kmap code | expand |
On Thu, 7 May 2020 08:00:01 -0700 ira.weiny@intel.com wrote: > parisc reimplements the kmap calls except to flush it's dcache. This is > arguably an abuse of kmap but regardless it is messy and confusing. > > Remove the duplicate code and have parisc define > ARCH_HAS_FLUSH_ON_KUNMAP for a kunmap_flush_on_unmap() architecture > specific call to flush the cache. checkpatch says: ERROR: #define of 'ARCH_HAS_FLUSH_ON_KUNMAP' is wrong - use Kconfig variables or standard guards instead #69: FILE: arch/parisc/include/asm/cacheflush.h:103: +#define ARCH_HAS_FLUSH_ON_KUNMAP which is fair enough, I guess. More conventional would be arch/parisc/include/asm/cacheflush.h: static inline void kunmap_flush_on_unmap(void *addr) { ... } #define kunmap_flush_on_unmap kunmap_flush_on_unmap include/linux/highmem.h: #ifndef kunmap_flush_on_unmap static inline void kunmap_flush_on_unmap(void *addr) { } #define kunmap_flush_on_unmap kunmap_flush_on_unmap #endif static inline void kunmap_atomic_high(void *addr) { /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() * handles re-enabling faults + preemption */ kunmap_flush_on_unmap(addr); } but I don't really think it's worth bothering changing it. (Ditto patch 3/15)
On Thu, May 07, 2020 at 01:52:58PM -0700, Andrew Morton wrote: > On Thu, 7 May 2020 08:00:01 -0700 ira.weiny@intel.com wrote: > > > parisc reimplements the kmap calls except to flush it's dcache. This is > > arguably an abuse of kmap but regardless it is messy and confusing. > > > > Remove the duplicate code and have parisc define > > ARCH_HAS_FLUSH_ON_KUNMAP for a kunmap_flush_on_unmap() architecture > > specific call to flush the cache. > > checkpatch says: > > ERROR: #define of 'ARCH_HAS_FLUSH_ON_KUNMAP' is wrong - use Kconfig variables or standard guards instead > #69: FILE: arch/parisc/include/asm/cacheflush.h:103: > +#define ARCH_HAS_FLUSH_ON_KUNMAP > > which is fair enough, I guess. More conventional would be > > arch/parisc/include/asm/cacheflush.h: > > static inline void kunmap_flush_on_unmap(void *addr) > { > ... > } > #define kunmap_flush_on_unmap kunmap_flush_on_unmap > > > include/linux/highmem.h: > > #ifndef kunmap_flush_on_unmap > static inline void kunmap_flush_on_unmap(void *addr) > { > } > #define kunmap_flush_on_unmap kunmap_flush_on_unmap > #endif > > > static inline void kunmap_atomic_high(void *addr) > { > /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() > * handles re-enabling faults + preemption */ > kunmap_flush_on_unmap(addr); > } > > > but I don't really think it's worth bothering changing it. > > (Ditto patch 3/15) Yes I was following the pattern already there. I'll fix up the last patch now. Ira
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index 119c9a7681bc..99663fc1f997 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h @@ -100,35 +100,11 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma } } -#include <asm/kmap_types.h> - -#define ARCH_HAS_KMAP - -static inline void *kmap(struct page *page) -{ - might_sleep(); - return page_address(page); -} - -static inline void kunmap(struct page *page) -{ - flush_kernel_dcache_page_addr(page_address(page)); -} - -static inline void *kmap_atomic(struct page *page) -{ - preempt_disable(); - pagefault_disable(); - return page_address(page); -} - -static inline void kunmap_atomic_high(void *addr) +#define ARCH_HAS_FLUSH_ON_KUNMAP +static inline void kunmap_flush_on_unmap(void *addr) { flush_kernel_dcache_page_addr(addr); } -#define kmap_atomic_prot(page, prot) kmap_atomic(page) -#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) - #endif /* _PARISC_CACHEFLUSH_H */ diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 89838306f50d..cc0c3904e501 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h @@ -129,7 +129,6 @@ static inline struct page *kmap_to_page(void *addr) static inline unsigned long totalhigh_pages(void) { return 0UL; } -#ifndef ARCH_HAS_KMAP static inline void *kmap(struct page *page) { might_sleep(); @@ -138,6 +137,9 @@ static inline void *kmap(struct page *page) static inline void kunmap(struct page *page) { +#ifdef ARCH_HAS_FLUSH_ON_KUNMAP + kunmap_flush_on_unmap(page_address(page)); +#endif } static inline void *kmap_atomic(struct page *page) @@ -150,14 +152,16 @@ static inline void *kmap_atomic(struct page *page) static inline void kunmap_atomic_high(void *addr) { - /* Nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() + /* Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() * handles re-enabling faults + preemption */ +#ifdef ARCH_HAS_FLUSH_ON_KUNMAP + kunmap_flush_on_unmap(addr); +#endif } #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) #define kmap_flush_unused() do {} while(0) -#endif #endif /* CONFIG_HIGHMEM */