Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

csky/mm/highmem: Switch to generic kmap atomic

No reason having the same code in every architecture.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Guo Ren <guoren@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20201103095857.681196473@linutronix.de

+8 -78
+1
arch/csky/Kconfig
··· 286 286 config HIGHMEM 287 287 bool "High Memory Support" 288 288 depends on !CPU_CK610 289 + select KMAP_LOCAL 289 290 default y 290 291 291 292 config FORCE_MAX_ZONEORDER
+2 -2
arch/csky/include/asm/fixmap.h
··· 8 8 #include <asm/memory.h> 9 9 #ifdef CONFIG_HIGHMEM 10 10 #include <linux/threads.h> 11 - #include <asm/kmap_types.h> 11 + #include <asm/kmap_size.h> 12 12 #endif 13 13 14 14 enum fixed_addresses { ··· 17 17 #endif 18 18 #ifdef CONFIG_HIGHMEM 19 19 FIX_KMAP_BEGIN, 20 - FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1, 20 + FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, 21 21 #endif 22 22 __end_of_fixed_addresses 23 23 };
+4 -2
arch/csky/include/asm/highmem.h
··· 9 9 #include <linux/init.h> 10 10 #include <linux/interrupt.h> 11 11 #include <linux/uaccess.h> 12 - #include <asm/kmap_types.h> 12 + #include <asm/kmap_size.h> 13 13 #include <asm/cache.h> 14 14 15 15 /* undef for production */ ··· 32 32 33 33 #define ARCH_HAS_KMAP_FLUSH_TLB 34 34 extern void kmap_flush_tlb(unsigned long addr); 35 - extern void *kmap_atomic_pfn(unsigned long pfn); 36 35 37 36 #define flush_cache_kmaps() do {} while (0) 37 + 38 + #define arch_kmap_local_post_map(vaddr, pteval) kmap_flush_tlb(vaddr) 39 + #define arch_kmap_local_post_unmap(vaddr) kmap_flush_tlb(vaddr) 38 40 39 41 extern void kmap_init(void); 40 42
+1 -74
arch/csky/mm/highmem.c
··· 9 9 #include <asm/tlbflush.h> 10 10 #include <asm/cacheflush.h> 11 11 12 - static pte_t *kmap_pte; 13 - 14 12 unsigned long highstart_pfn, highend_pfn; 15 13 16 14 void kmap_flush_tlb(unsigned long addr) ··· 17 19 } 18 20 EXPORT_SYMBOL(kmap_flush_tlb); 19 21 20 - void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) 21 - { 22 - unsigned long vaddr; 23 - int idx, type; 24 - 25 - type = kmap_atomic_idx_push(); 26 - idx = type + KM_TYPE_NR*smp_processor_id(); 27 - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); 28 - #ifdef CONFIG_DEBUG_HIGHMEM 29 - BUG_ON(!pte_none(*(kmap_pte - idx))); 30 - #endif 31 - set_pte(kmap_pte-idx, mk_pte(page, prot)); 32 - flush_tlb_one((unsigned long)vaddr); 33 - 34 - return (void *)vaddr; 35 - } 36 - EXPORT_SYMBOL(kmap_atomic_high_prot); 37 - 38 - void kunmap_atomic_high(void *kvaddr) 39 - { 40 - unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; 41 - int idx; 42 - 43 - if (vaddr < FIXADDR_START) 44 - return; 45 - 46 - #ifdef CONFIG_DEBUG_HIGHMEM 47 - idx = KM_TYPE_NR*smp_processor_id() + kmap_atomic_idx(); 48 - 49 - BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); 50 - 51 - pte_clear(&init_mm, vaddr, kmap_pte - idx); 52 - flush_tlb_one(vaddr); 53 - #else 54 - (void) idx; /* to kill a warning */ 55 - #endif 56 - kmap_atomic_idx_pop(); 57 - } 58 - EXPORT_SYMBOL(kunmap_atomic_high); 59 - 60 - /* 61 - * This is the same as kmap_atomic() but can map memory that doesn't 62 - * have a struct page associated with it. 63 - */ 64 - void *kmap_atomic_pfn(unsigned long pfn) 65 - { 66 - unsigned long vaddr; 67 - int idx, type; 68 - 69 - pagefault_disable(); 70 - 71 - type = kmap_atomic_idx_push(); 72 - idx = type + KM_TYPE_NR*smp_processor_id(); 73 - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); 74 - set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL)); 75 - flush_tlb_one(vaddr); 76 - 77 - return (void *) vaddr; 78 - } 79 - 80 - static void __init kmap_pages_init(void) 22 + void __init kmap_init(void) 81 23 { 82 24 unsigned long vaddr; 83 25 pgd_t *pgd; ··· 33 95 pmd = pmd_offset(pud, vaddr); 34 96 pte = pte_offset_kernel(pmd, vaddr); 35 97 pkmap_page_table = pte; 36 - } 37 - 38 - void __init kmap_init(void) 39 - { 40 - unsigned long vaddr; 41 - 42 - kmap_pages_init(); 43 - 44 - vaddr = __fix_to_virt(FIX_KMAP_BEGIN); 45 - 46 - kmap_pte = pte_offset_kernel((pmd_t *)pgd_offset_k(vaddr), vaddr); 47 98 }