sparc/mm/highmem: Switch to generic kmap atomic
authorThomas Gleixner <tglx@linutronix.de>
Tue, 3 Nov 2020 09:27:28 +0000 (10:27 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 6 Nov 2020 22:14:57 +0000 (23:14 +0100)
No reason having the same code in every architecture

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20201103095858.197568209@linutronix.de
arch/sparc/Kconfig
arch/sparc/include/asm/highmem.h
arch/sparc/include/asm/kmap_types.h [deleted file]
arch/sparc/include/asm/vaddrs.h
arch/sparc/mm/Makefile
arch/sparc/mm/highmem.c [deleted file]
arch/sparc/mm/srmmu.c

index a6ca135..e841708 100644 (file)
@@ -139,6 +139,7 @@ config MMU
 config HIGHMEM
        bool
        default y if SPARC32
+       select KMAP_LOCAL
 
 config ZONE_DMA
        bool
index 6c35f0d..8751162 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/interrupt.h>
 #include <linux/pgtable.h>
 #include <asm/vaddrs.h>
-#include <asm/kmap_types.h>
 #include <asm/pgtsrmmu.h>
 
 /* declarations for highmem.c */
@@ -33,8 +32,6 @@ extern unsigned long highstart_pfn, highend_pfn;
 #define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE)
 extern pte_t *pkmap_page_table;
 
-void kmap_init(void) __init;
-
 /*
  * Right now we initialize only a single pte table. It can be extended
  * easily, subsequent pte tables have to be allocated in one physical
@@ -53,6 +50,11 @@ void kmap_init(void) __init;
 
 #define flush_cache_kmaps()    flush_cache_all()
 
+/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */
+#define arch_kmap_local_post_map(vaddr, pteval)        flush_cache_all()
+#define arch_kmap_local_post_unmap(vaddr)      flush_cache_all()
+
+
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_HIGHMEM_H */
diff --git a/arch/sparc/include/asm/kmap_types.h b/arch/sparc/include/asm/kmap_types.h
deleted file mode 100644 (file)
index 55a99b6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _ASM_KMAP_TYPES_H
-#define _ASM_KMAP_TYPES_H
-
-/* Dummy header just to define km_type.  None of this
- * is actually used on sparc.  -DaveM
- */
-
-#include <asm-generic/kmap_types.h>
-
-#endif
index 84d054b..4fec034 100644 (file)
 #define SRMMU_NOCACHE_ALCRATIO 64      /* 256 pages per 64MB of system RAM */
 
 #ifndef __ASSEMBLY__
-#include <asm/kmap_types.h>
+#include <asm/kmap_size.h>
 
 enum fixed_addresses {
        FIX_HOLE,
 #ifdef CONFIG_HIGHMEM
        FIX_KMAP_BEGIN,
-       FIX_KMAP_END = (KM_TYPE_NR * NR_CPUS),
+       FIX_KMAP_END = (KM_MAX_IDX * NR_CPUS),
 #endif
        __end_of_fixed_addresses
 };
index b078205..68db1f8 100644 (file)
@@ -15,6 +15,3 @@ obj-$(CONFIG_SPARC32)   += leon_mm.o
 
 # Only used by sparc64
 obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
-
-# Only used by sparc32
-obj-$(CONFIG_HIGHMEM)   += highmem.o
diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c
deleted file mode 100644 (file)
index 8f2a2af..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- *  highmem.c: virtual kernel memory mappings for high memory
- *
- *  Provides kernel-static versions of atomic kmap functions originally
- *  found as inlines in include/asm-sparc/highmem.h.  These became
- *  needed as kmap_atomic() and kunmap_atomic() started getting
- *  called from within modules.
- *  -- Tomas Szepe <szepe@pinerecords.com>, September 2002
- *
- *  But kmap_atomic() and kunmap_atomic() cannot be inlined in
- *  modules because they are loaded with btfixup-ped functions.
- */
-
-/*
- * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap
- * gives a more generic (and caching) interface. But kmap_atomic can
- * be used in IRQ contexts, so in some (very limited) cases we need it.
- *
- * XXX This is an old text. Actually, it's good to use atomic kmaps,
- * provided you remember that they are atomic and not try to sleep
- * with a kmap taken, much like a spinlock. Non-atomic kmaps are
- * shared by CPUs, and so precious, and establishing them requires IPI.
- * Atomic kmaps are lightweight and we may have NCPUS more of them.
- */
-#include <linux/highmem.h>
-#include <linux/export.h>
-#include <linux/mm.h>
-
-#include <asm/cacheflush.h>
-#include <asm/tlbflush.h>
-#include <asm/vaddrs.h>
-
-static pte_t *kmap_pte;
-
-void __init kmap_init(void)
-{
-       unsigned long address = __fix_to_virt(FIX_KMAP_BEGIN);
-
-        /* cache the first kmap pte */
-        kmap_pte = virt_to_kpte(address);
-}
-
-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
-{
-       unsigned long vaddr;
-       long idx, type;
-
-       type = kmap_atomic_idx_push();
-       idx = type + KM_TYPE_NR*smp_processor_id();
-       vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-
-/* XXX Fix - Anton */
-#if 0
-       __flush_cache_one(vaddr);
-#else
-       flush_cache_all();
-#endif
-
-#ifdef CONFIG_DEBUG_HIGHMEM
-       BUG_ON(!pte_none(*(kmap_pte-idx)));
-#endif
-       set_pte(kmap_pte-idx, mk_pte(page, prot));
-/* XXX Fix - Anton */
-#if 0
-       __flush_tlb_one(vaddr);
-#else
-       flush_tlb_all();
-#endif
-
-       return (void*) vaddr;
-}
-EXPORT_SYMBOL(kmap_atomic_high_prot);
-
-void kunmap_atomic_high(void *kvaddr)
-{
-       unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-       int type;
-
-       if (vaddr < FIXADDR_START)
-               return;
-
-       type = kmap_atomic_idx();
-
-#ifdef CONFIG_DEBUG_HIGHMEM
-       {
-               unsigned long idx;
-
-               idx = type + KM_TYPE_NR * smp_processor_id();
-               BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
-
-               /* XXX Fix - Anton */
-#if 0
-               __flush_cache_one(vaddr);
-#else
-               flush_cache_all();
-#endif
-
-               /*
-                * force other mappings to Oops if they'll try to access
-                * this pte without first remap it
-                */
-               pte_clear(&init_mm, vaddr, kmap_pte-idx);
-               /* XXX Fix - Anton */
-#if 0
-               __flush_tlb_one(vaddr);
-#else
-               flush_tlb_all();
-#endif
-       }
-#endif
-
-       kmap_atomic_idx_pop();
-}
-EXPORT_SYMBOL(kunmap_atomic_high);
index 0070f8b..a03caa5 100644 (file)
@@ -971,8 +971,6 @@ void __init srmmu_paging_init(void)
 
        sparc_context_init(num_contexts);
 
-       kmap_init();
-
        {
                unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };