lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/13] alpha: switch from DISCONTIGMEM to SPARSEMEM
    Date
    From: Mike Rapoport <rppt@linux.ibm.com>

    Enable SPARSEMEM support on alpha and deprecate DISCONTIGMEM.

    The required changes are mostly around moving duplicated definitions of
    page access and address conversion macros to a common place and making sure
    they are available for all memory models.

    The DISCONTINGMEM support is marked as BROKEN an will be removed in a
    couple of releases.

    Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
    ---
    arch/alpha/Kconfig | 8 ++++++++
    arch/alpha/include/asm/mmzone.h | 14 ++------------
    arch/alpha/include/asm/page.h | 7 ++++---
    arch/alpha/include/asm/pgtable.h | 12 +++++-------
    arch/alpha/include/asm/sparsemem.h | 18 ++++++++++++++++++
    arch/alpha/kernel/setup.c | 1 +
    6 files changed, 38 insertions(+), 22 deletions(-)
    create mode 100644 arch/alpha/include/asm/sparsemem.h

    diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
    index d6e9fc7a7b19..aedf5c296f13 100644
    --- a/arch/alpha/Kconfig
    +++ b/arch/alpha/Kconfig
    @@ -40,6 +40,7 @@ config ALPHA
    select CPU_NO_EFFICIENT_FFS if !ALPHA_EV67
    select MMU_GATHER_NO_RANGE
    select SET_FS
    + select SPARSEMEM_EXTREME if SPARSEMEM
    help
    The Alpha is a 64-bit general-purpose processor designed and
    marketed by the Digital Equipment Corporation of blessed memory,
    @@ -551,12 +552,19 @@ config NR_CPUS

    config ARCH_DISCONTIGMEM_ENABLE
    bool "Discontiguous Memory Support"
    + depends on BROKEN
    help
    Say Y to support efficient handling of discontiguous physical memory,
    for architectures which are either NUMA (Non-Uniform Memory Access)
    or have huge holes in the physical address space for other reasons.
    See <file:Documentation/vm/numa.rst> for more.

    +config ARCH_SPARSEMEM_ENABLE
    + bool "Sparse Memory Support"
    + help
    + Say Y to support efficient handling of discontiguous physical memory,
    + for systems that have huge holes in the physical address space.
    +
    config NUMA
    bool "NUMA Support (EXPERIMENTAL)"
    depends on DISCONTIGMEM && BROKEN
    diff --git a/arch/alpha/include/asm/mmzone.h b/arch/alpha/include/asm/mmzone.h
    index 9b521c857436..86644604d977 100644
    --- a/arch/alpha/include/asm/mmzone.h
    +++ b/arch/alpha/include/asm/mmzone.h
    @@ -6,6 +6,8 @@
    #ifndef _ASM_MMZONE_H_
    #define _ASM_MMZONE_H_

    +#ifdef CONFIG_DISCONTIGMEM
    +
    #include <asm/smp.h>

    /*
    @@ -45,8 +47,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
    }
    #endif

    -#ifdef CONFIG_DISCONTIGMEM
    -
    /*
    * Following are macros that each numa implementation must define.
    */
    @@ -68,11 +68,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
    /* XXX: FIXME -- nyc */
    #define kern_addr_valid(kaddr) (0)

    -#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
    -
    -#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32))
    -#define pte_pfn(pte) (pte_val(pte) >> 32)
    -
    #define mk_pte(page, pgprot) \
    ({ \
    pte_t pte; \
    @@ -95,16 +90,11 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
    __xx; \
    })

    -#define page_to_pa(page) \
    - (page_to_pfn(page) << PAGE_SHIFT)
    -
    #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT))
    #define pfn_valid(pfn) \
    (((pfn) - node_start_pfn(pfn_to_nid(pfn))) < \
    node_spanned_pages(pfn_to_nid(pfn))) \

    -#define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))
    -
    #endif /* CONFIG_DISCONTIGMEM */

    #endif /* _ASM_MMZONE_H_ */
    diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h
    index e241bd88880f..268f99b4602b 100644
    --- a/arch/alpha/include/asm/page.h
    +++ b/arch/alpha/include/asm/page.h
    @@ -83,12 +83,13 @@ typedef struct page *pgtable_t;

    #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET)
    #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET))
    -#ifndef CONFIG_DISCONTIGMEM
    +
    #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
    +#define virt_addr_valid(kaddr) pfn_valid((__pa(kaddr) >> PAGE_SHIFT))

    +#ifdef CONFIG_FLATMEM
    #define pfn_valid(pfn) ((pfn) < max_mapnr)
    -#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
    -#endif /* CONFIG_DISCONTIGMEM */
    +#endif /* CONFIG_FLATMEM */

    #include <asm-generic/memory_model.h>
    #include <asm-generic/getorder.h>
    diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h
    index 660b14ce1317..8d856c62e22a 100644
    --- a/arch/alpha/include/asm/pgtable.h
    +++ b/arch/alpha/include/asm/pgtable.h
    @@ -203,10 +203,10 @@ extern unsigned long __zero_page(void);
    * Conversion functions: convert a page and protection to a page entry,
    * and a page entry and page directory to the page they refer to.
    */
    -#ifndef CONFIG_DISCONTIGMEM
    -#define page_to_pa(page) (((page) - mem_map) << PAGE_SHIFT)
    -
    +#define page_to_pa(page) (page_to_pfn(page) << PAGE_SHIFT)
    #define pte_pfn(pte) (pte_val(pte) >> 32)
    +
    +#ifndef CONFIG_DISCONTIGMEM
    #define pte_page(pte) pfn_to_page(pte_pfn(pte))
    #define mk_pte(page, pgprot) \
    ({ \
    @@ -236,10 +236,8 @@ pmd_page_vaddr(pmd_t pmd)
    return ((pmd_val(pmd) & _PFN_MASK) >> (32-PAGE_SHIFT)) + PAGE_OFFSET;
    }

    -#ifndef CONFIG_DISCONTIGMEM
    -#define pmd_page(pmd) (mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32))
    -#define pud_page(pud) (mem_map + ((pud_val(pud) & _PFN_MASK) >> 32))
    -#endif
    +#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32))
    +#define pud_page(pud) (pfn_to_page(pud_val(pud) >> 32))

    extern inline unsigned long pud_page_vaddr(pud_t pgd)
    { return PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); }
    diff --git a/arch/alpha/include/asm/sparsemem.h b/arch/alpha/include/asm/sparsemem.h
    new file mode 100644
    index 000000000000..a0820fd2d4b1
    --- /dev/null
    +++ b/arch/alpha/include/asm/sparsemem.h
    @@ -0,0 +1,18 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +#ifndef _ASM_ALPHA_SPARSEMEM_H
    +#define _ASM_ALPHA_SPARSEMEM_H
    +
    +#ifdef CONFIG_SPARSEMEM
    +
    +#define SECTION_SIZE_BITS 27
    +
    +/*
    + * According to "Alpha Architecture Reference Manual" physical
    + * addresses are at most 48 bits.
    + * https://download.majix.org/dec/alpha_arch_ref.pdf
    + */
    +#define MAX_PHYSMEM_BITS 48
    +
    +#endif /* CONFIG_SPARSEMEM */
    +
    +#endif /* _ASM_ALPHA_SPARSEMEM_H */
    diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
    index 916e42d74a86..03dda3beb3bd 100644
    --- a/arch/alpha/kernel/setup.c
    +++ b/arch/alpha/kernel/setup.c
    @@ -648,6 +648,7 @@ setup_arch(char **cmdline_p)
    /* Find our memory. */
    setup_memory(kernel_end);
    memblock_set_bottom_up(true);
    + sparse_init();

    /* First guess at cpu cache sizes. Do this before init_arch. */
    determine_cpu_caches(cpu->type);
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-10-27 12:31    [W:3.275 / U:1.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site