lkml.org 
[lkml]   [2020]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 12/37] microblaze/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: Michal Simek <monstr@monstr.eu>
    ---
    V3: Remove the kmap types cruft
    ---
    arch/microblaze/Kconfig | 1
    arch/microblaze/include/asm/fixmap.h | 4 -
    arch/microblaze/include/asm/highmem.h | 6 ++
    arch/microblaze/mm/Makefile | 1
    arch/microblaze/mm/highmem.c | 78 ----------------------------------
    arch/microblaze/mm/init.c | 6 --
    6 files changed, 8 insertions(+), 88 deletions(-)

    --- a/arch/microblaze/Kconfig
    +++ b/arch/microblaze/Kconfig
    @@ -155,6 +155,7 @@ config XILINX_UNCACHED_SHADOW
    config HIGHMEM
    bool "High memory support"
    depends on MMU
    + select KMAP_LOCAL
    help
    The address space of Microblaze processors is only 4 Gigabytes large
    and it has to accommodate user address space, kernel address
    --- a/arch/microblaze/include/asm/fixmap.h
    +++ b/arch/microblaze/include/asm/fixmap.h
    @@ -20,7 +20,7 @@
    #include <asm/page.h>
    #ifdef CONFIG_HIGHMEM
    #include <linux/threads.h>
    -#include <asm/kmap_types.h>
    +#include <asm/kmap_size.h>
    #endif

    #define FIXADDR_TOP ((unsigned long)(-PAGE_SIZE))
    @@ -47,7 +47,7 @@ enum fixed_addresses {
    FIX_HOLE,
    #ifdef CONFIG_HIGHMEM
    FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
    - FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * num_possible_cpus()) - 1,
    + FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * num_possible_cpus()) - 1,
    #endif
    __end_of_fixed_addresses
    };
    --- a/arch/microblaze/include/asm/highmem.h
    +++ b/arch/microblaze/include/asm/highmem.h
    @@ -25,7 +25,6 @@
    #include <linux/uaccess.h>
    #include <asm/fixmap.h>

    -extern pte_t *kmap_pte;
    extern pte_t *pkmap_page_table;

    /*
    @@ -52,6 +51,11 @@ extern pte_t *pkmap_page_table;

    #define flush_cache_kmaps() { flush_icache(); flush_dcache(); }

    +#define arch_kmap_local_post_map(vaddr, pteval) \
    + local_flush_tlb_page(NULL, vaddr);
    +#define arch_kmap_local_post_unmap(vaddr) \
    + local_flush_tlb_page(NULL, vaddr);
    +
    #endif /* __KERNEL__ */

    #endif /* _ASM_HIGHMEM_H */
    --- a/arch/microblaze/mm/Makefile
    +++ b/arch/microblaze/mm/Makefile
    @@ -6,4 +6,3 @@
    obj-y := consistent.o init.o

    obj-$(CONFIG_MMU) += pgtable.o mmu_context.o fault.o
    -obj-$(CONFIG_HIGHMEM) += highmem.o
    --- a/arch/microblaze/mm/highmem.c
    +++ /dev/null
    @@ -1,78 +0,0 @@
    -// SPDX-License-Identifier: GPL-2.0
    -/*
    - * highmem.c: virtual kernel memory mappings for high memory
    - *
    - * PowerPC version, stolen from the i386 version.
    - *
    - * Used in CONFIG_HIGHMEM systems for memory pages which
    - * are not addressable by direct kernel virtual addresses.
    - *
    - * Copyright (C) 1999 Gerhard Wichert, Siemens AG
    - * Gerhard.Wichert@pdb.siemens.de
    - *
    - *
    - * Redesigned the x86 32-bit VM architecture to deal with
    - * up to 16 Terrabyte physical memory. With current x86 CPUs
    - * we now support up to 64 Gigabytes physical RAM.
    - *
    - * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
    - *
    - * Reworked for PowerPC by various contributors. Moved from
    - * highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp.
    - */
    -
    -#include <linux/export.h>
    -#include <linux/highmem.h>
    -
    -/*
    - * 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.
    - */
    -#include <asm/tlbflush.h>
    -
    -void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
    -{
    -
    - unsigned long vaddr;
    - int idx, type;
    -
    - type = kmap_atomic_idx_push();
    - idx = type + KM_TYPE_NR*smp_processor_id();
    - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
    -#ifdef CONFIG_DEBUG_HIGHMEM
    - BUG_ON(!pte_none(*(kmap_pte-idx)));
    -#endif
    - set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
    - local_flush_tlb_page(NULL, vaddr);
    -
    - 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;
    - unsigned int idx;
    -
    - if (vaddr < __fix_to_virt(FIX_KMAP_END))
    - return;
    -
    - type = kmap_atomic_idx();
    -
    - idx = type + KM_TYPE_NR * smp_processor_id();
    -#ifdef CONFIG_DEBUG_HIGHMEM
    - BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
    -#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);
    - local_flush_tlb_page(NULL, vaddr);
    -
    - kmap_atomic_idx_pop();
    -}
    -EXPORT_SYMBOL(kunmap_atomic_high);
    --- a/arch/microblaze/mm/init.c
    +++ b/arch/microblaze/mm/init.c
    @@ -49,17 +49,11 @@ unsigned long lowmem_size;
    EXPORT_SYMBOL(min_low_pfn);
    EXPORT_SYMBOL(max_low_pfn);

    -#ifdef CONFIG_HIGHMEM
    -pte_t *kmap_pte;
    -EXPORT_SYMBOL(kmap_pte);
    -
    static void __init highmem_init(void)
    {
    pr_debug("%x\n", (u32)PKMAP_BASE);
    map_page(PKMAP_BASE, 0, 0); /* XXX gross */
    pkmap_page_table = virt_to_kpte(PKMAP_BASE);
    -
    - kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN));
    }

    static void highmem_setup(void)
    \
     
     \ /
      Last update: 2020-11-03 11:37    [W:4.037 / U:0.736 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site