arch/kmap: remove redundant arch specific kmaps
authorIra Weiny <ira.weiny@intel.com>
Thu, 4 Jun 2020 23:47:30 +0000 (16:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Jun 2020 02:06:22 +0000 (19:06 -0700)
The kmap code for all the architectures is almost 100% identical.

Lift the common code to the core.  Use ARCH_HAS_KMAP_FLUSH_TLB to indicate
if an arch defines kmap_flush_tlb() and call if if needed.

This also has the benefit of changing kmap() on a number of architectures
to be an inline call rather than an actual function.

Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Helge Deller <deller@gmx.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20200507150004.1423069-4-ira.weiny@intel.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
17 files changed:
arch/arc/include/asm/highmem.h
arch/arc/mm/highmem.c
arch/arm/include/asm/highmem.h
arch/arm/mm/highmem.c
arch/csky/include/asm/highmem.h
arch/csky/mm/highmem.c
arch/microblaze/include/asm/highmem.h
arch/mips/include/asm/highmem.h
arch/mips/mm/highmem.c
arch/nds32/include/asm/highmem.h
arch/nds32/mm/highmem.c
arch/powerpc/include/asm/highmem.h
arch/sparc/include/asm/highmem.h
arch/x86/include/asm/highmem.h
arch/x86/mm/highmem_32.c
arch/xtensa/include/asm/highmem.h
include/linux/highmem.h

index 042e92921c4c1aa8fe52e17850d933d14d0df162..96eb67c869618e908de1a1e24b20253639ce2bbc 100644 (file)
@@ -30,8 +30,6 @@
 
 #include <asm/cacheflush.h>
 
-extern void *kmap(struct page *page);
-extern void *kmap_high(struct page *page);
 extern void *kmap_atomic(struct page *page);
 extern void __kunmap_atomic(void *kvaddr);
 extern void kunmap_high(struct page *page);
index 39ef7b9a3aa9cc7520b816d630ca65302b5dda75..4db13a6b9f3b4883d0c1e5e8149457ecf268aa74 100644 (file)
 extern pte_t * pkmap_page_table;
 static pte_t * fixmap_page_table;
 
-void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-
-       return kmap_high(page);
-}
-EXPORT_SYMBOL(kmap);
-
 void *kmap_atomic(struct page *page)
 {
        int idx, cpu_idx;
index eb4e4207cd3caed204fecdaeb71956eaa1e0b074..c917522541de8d738037d80014e09a568661f40e 100644 (file)
@@ -20,7 +20,6 @@
 
 extern pte_t *pkmap_page_table;
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
 /*
@@ -63,7 +62,6 @@ static inline void *kmap_high_get(struct page *page)
  * when CONFIG_HIGHMEM is not set.
  */
 #ifdef CONFIG_HIGHMEM
-extern void *kmap(struct page *page);
 extern void kunmap(struct page *page);
 extern void *kmap_atomic(struct page *page);
 extern void __kunmap_atomic(void *kvaddr);
index cc6eb79ef20c51818b8bfca668fbb138a356dfa8..e8ba37c36590793ad838603973e4cbc8a4971946 100644 (file)
@@ -31,15 +31,6 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr)
        return *ptep;
 }
 
-void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-EXPORT_SYMBOL(kmap);
-
 void kunmap(struct page *page)
 {
        might_sleep();
index a345a2f2c22e6cc6f8eeecd52a36f7df54b2470b..9d0516e381106178e154f9c093e077d0795b968e 100644 (file)
@@ -30,10 +30,10 @@ extern pte_t *pkmap_page_table;
 #define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
 #define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
-extern void *kmap(struct page *page);
+#define ARCH_HAS_KMAP_FLUSH_TLB
+extern void kmap_flush_tlb(unsigned long addr);
 extern void kunmap(struct page *page);
 extern void *kmap_atomic(struct page *page);
 extern void __kunmap_atomic(void *kvaddr);
index 690d678649d13f0764e0dd0a07c65c96644e671f..4a3c273bc8b95e84ef28b73d275b873fcc1f6b85 100644 (file)
@@ -13,18 +13,12 @@ static pte_t *kmap_pte;
 
 unsigned long highstart_pfn, highend_pfn;
 
-void *kmap(struct page *page)
+void kmap_flush_tlb(unsigned long addr)
 {
-       void *addr;
-
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       addr = kmap_high(page);
-       flush_tlb_one((unsigned long)addr);
-
-       return addr;
+       flush_tlb_one(addr);
 }
+EXPORT_SYMBOL(kmap_flush_tlb);
+
 EXPORT_SYMBOL(kmap);
 
 void kunmap(struct page *page)
index 99ced7278b5c7f1dd41f4bdda70575135a9b4d58..8c5bfd228bd8c85eaef76cab5fcf69004408c21d 100644 (file)
@@ -51,19 +51,10 @@ extern pte_t *pkmap_page_table;
 #define PKMAP_NR(virt)  ((virt - PKMAP_BASE) >> PAGE_SHIFT)
 #define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 extern void *kmap_atomic_prot(struct page *page, pgprot_t prot);
 extern void __kunmap_atomic(void *kvaddr);
 
-static inline void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-
 static inline void kunmap(struct page *page)
 {
        might_sleep();
index 9d84aafc33d052096d678658c41ffb5e1bb2efa8..1f741e3ecabf9c2c0b37fb24cecb8ac795138476 100644 (file)
@@ -46,10 +46,10 @@ extern pte_t *pkmap_page_table;
 #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
 #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
 
-extern void * kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
-extern void *kmap(struct page *page);
+#define ARCH_HAS_KMAP_FLUSH_TLB
+extern void kmap_flush_tlb(unsigned long addr);
 extern void kunmap(struct page *page);
 extern void *kmap_atomic(struct page *page);
 extern void __kunmap_atomic(void *kvaddr);
index edd889f6cede404d719e16ac3a7ff599fb987de8..c72058bfead6372ae1972ada82e6e7f70691de4e 100644 (file)
@@ -12,19 +12,11 @@ static pte_t *kmap_pte;
 
 unsigned long highstart_pfn, highend_pfn;
 
-void *kmap(struct page *page)
+void kmap_flush_tlb(unsigned long addr)
 {
-       void *addr;
-
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       addr = kmap_high(page);
-       flush_tlb_one((unsigned long)addr);
-
-       return addr;
+       flush_tlb_one(addr);
 }
-EXPORT_SYMBOL(kmap);
+EXPORT_SYMBOL(kmap_flush_tlb);
 
 void kunmap(struct page *page)
 {
index b3a82c97ded3a9a7d78c3e190a6b29df34ad7981..b13654a79069586e9255c2f2afb5e937bd01453b 100644 (file)
@@ -44,7 +44,6 @@ extern unsigned long highstart_pfn, highend_pfn;
 
 extern pte_t *pkmap_page_table;
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
 extern void kmap_init(void);
@@ -54,7 +53,6 @@ extern void kmap_init(void);
  * when CONFIG_HIGHMEM is not set.
  */
 #ifdef CONFIG_HIGHMEM
-extern void *kmap(struct page *page);
 extern void kunmap(struct page *page);
 extern void *kmap_atomic(struct page *page);
 extern void __kunmap_atomic(void *kvaddr);
index 4c7c28e994ea766a507ef53fedee5f3e65bb1df5..d0cde53b84ae9710c4fabe847583bf2b876eefb3 100644 (file)
 #include <asm/fixmap.h>
 #include <asm/tlbflush.h>
 
-void *kmap(struct page *page)
-{
-       unsigned long vaddr;
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       vaddr = (unsigned long)kmap_high(page);
-       return (void *)vaddr;
-}
-
-EXPORT_SYMBOL(kmap);
-
 void kunmap(struct page *page)
 {
        might_sleep();
index 529512f6d65a6085a97164c012d7a71c30e54dac..f14e4feef6d5e1803a8a89745a5bb344ea31a993 100644 (file)
@@ -59,19 +59,10 @@ extern pte_t *pkmap_page_table;
 #define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
 #define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 extern void *kmap_atomic_prot(struct page *page, pgprot_t prot);
 extern void __kunmap_atomic(void *kvaddr);
 
-static inline void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-
 static inline void kunmap(struct page *page)
 {
        might_sleep();
index 7dd2d4b3f9800cfe5e0fb84b983ee073c859b397..2ff1192047f75ad78cf68e00b9afbc21d31285bf 100644 (file)
@@ -50,17 +50,8 @@ void kmap_init(void) __init;
 
 #define PKMAP_END (PKMAP_ADDR(LAST_PKMAP))
 
-void *kmap_high(struct page *page);
 void kunmap_high(struct page *page);
 
-static inline void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-
 static inline void kunmap(struct page *page)
 {
        might_sleep();
index a8059930056d22cddb7dc8794e63738f2481560b..c916a28a9738d2ba83609fa075fd714bf1116b02 100644 (file)
@@ -58,10 +58,8 @@ extern unsigned long highstart_pfn, highend_pfn;
 #define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
 #define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
 
-extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
-void *kmap(struct page *page);
 void kunmap(struct page *page);
 
 void *kmap_atomic_prot(struct page *page, pgprot_t prot);
index 8af66382672b4f59af08fec978417ed0da788fb3..12591a81b85c859482f0a2cee13eea8080b12329 100644 (file)
@@ -4,15 +4,6 @@
 #include <linux/swap.h> /* for totalram_pages */
 #include <linux/memblock.h>
 
-void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-EXPORT_SYMBOL(kmap);
-
 void kunmap(struct page *page)
 {
        might_sleep();
index a9587c85be85d5508045fc5db6bd3359ab79738e..2546b88ddecf79b961049087d95c1d42d3504ec4 100644 (file)
@@ -63,17 +63,8 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color)
 
 extern pte_t *pkmap_page_table;
 
-void *kmap_high(struct page *page);
 void kunmap_high(struct page *page);
 
-static inline void *kmap(struct page *page)
-{
-       might_sleep();
-       if (!PageHighMem(page))
-               return page_address(page);
-       return kmap_high(page);
-}
-
 static inline void kunmap(struct page *page)
 {
        might_sleep();
index ea5cdbd8c2c326cd6f8702bfc2e6aa2e9fbca2c0..fc3adc51254a36caaed50223b5c3206105efb604 100644 (file)
@@ -34,6 +34,24 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
 #ifdef CONFIG_HIGHMEM
 #include <asm/highmem.h>
 
+#ifndef ARCH_HAS_KMAP_FLUSH_TLB
+static inline void kmap_flush_tlb(unsigned long addr) { }
+#endif
+
+void *kmap_high(struct page *page);
+static inline void *kmap(struct page *page)
+{
+       void *addr;
+
+       might_sleep();
+       if (!PageHighMem(page))
+               addr = page_address(page);
+       else
+               addr = kmap_high(page);
+       kmap_flush_tlb((unsigned long)addr);
+       return addr;
+}
+
 /* declarations for linux/mm/highmem.c */
 unsigned int nr_free_highpages(void);
 extern atomic_long_t _totalhigh_pages;