On 02.06.21 12:53, Mike Rapoport wrote:
From: Mike Rapoport <r...@linux.ibm.com>

NUMA is marked broken on alpha for more than 15 years and DISCONTIGMEM was
replaced with SPARSEMEM in v5.11.

Remove both NUMA and DISCONTIGMEM support from alpha.

Signed-off-by: Mike Rapoport <r...@linux.ibm.com>
---
  arch/alpha/Kconfig                |  22 ---
  arch/alpha/include/asm/machvec.h  |   6 -
  arch/alpha/include/asm/mmzone.h   | 100 --------------
  arch/alpha/include/asm/pgtable.h  |   4 -
  arch/alpha/include/asm/topology.h |  39 ------
  arch/alpha/kernel/core_marvel.c   |  53 +------
  arch/alpha/kernel/core_wildfire.c |  29 +---
  arch/alpha/kernel/pci_iommu.c     |  29 ----
  arch/alpha/kernel/proto.h         |   8 --
  arch/alpha/kernel/setup.c         |  16 ---
  arch/alpha/kernel/sys_marvel.c    |   5 -
  arch/alpha/kernel/sys_wildfire.c  |   5 -
  arch/alpha/mm/Makefile            |   2 -
  arch/alpha/mm/init.c              |   3 -
  arch/alpha/mm/numa.c              | 223 ------------------------------
  15 files changed, 4 insertions(+), 540 deletions(-)
  delete mode 100644 arch/alpha/include/asm/mmzone.h
  delete mode 100644 arch/alpha/mm/numa.c

diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
index 5998106faa60..8954216b9956 100644
--- a/arch/alpha/Kconfig
+++ b/arch/alpha/Kconfig
@@ -549,29 +549,12 @@ config NR_CPUS
          MARVEL support can handle a maximum of 32 CPUs, all the others
          with working support have a maximum of 4 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
-       help
-         Say Y to compile the kernel to support NUMA (Non-Uniform Memory
-         Access).  This option is for configuring high-end multiprocessor
-         server machines.  If in doubt, say N.
-
  config ALPHA_WTINT
        bool "Use WTINT" if ALPHA_SRM || ALPHA_GENERIC
        default y if ALPHA_QEMU
@@ -596,11 +579,6 @@ config ALPHA_WTINT
If unsure, say N. -config NODES_SHIFT
-       int
-       default "7"
-       depends on NEED_MULTIPLE_NODES
-
  # LARGE_VMALLOC is racy, if you *really* need it then fix it first
  config ALPHA_LARGE_VMALLOC
        bool
diff --git a/arch/alpha/include/asm/machvec.h b/arch/alpha/include/asm/machvec.h
index a4e96e2bec74..e49fabce7b33 100644
--- a/arch/alpha/include/asm/machvec.h
+++ b/arch/alpha/include/asm/machvec.h
@@ -99,12 +99,6 @@ struct alpha_machine_vector
const char *vector_name; - /* NUMA information */
-       int (*pa_to_nid)(unsigned long);
-       int (*cpuid_to_nid)(int);
-       unsigned long (*node_mem_start)(int);
-       unsigned long (*node_mem_size)(int);
-
        /* System specific parameters.  */
        union {
            struct {
diff --git a/arch/alpha/include/asm/mmzone.h b/arch/alpha/include/asm/mmzone.h
deleted file mode 100644
index 86644604d977..000000000000
--- a/arch/alpha/include/asm/mmzone.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Written by Kanoj Sarcar (ka...@sgi.com) Aug 99
- * Adapted for the alpha wildfire architecture Jan 2001.
- */
-#ifndef _ASM_MMZONE_H_
-#define _ASM_MMZONE_H_
-
-#ifdef CONFIG_DISCONTIGMEM
-
-#include <asm/smp.h>
-
-/*
- * Following are macros that are specific to this numa platform.
- */
-
-extern pg_data_t node_data[];
-
-#define alpha_pa_to_nid(pa)            \
-        (alpha_mv.pa_to_nid            \
-        ? alpha_mv.pa_to_nid(pa)       \
-        : (0))
-#define node_mem_start(nid)            \
-        (alpha_mv.node_mem_start       \
-        ? alpha_mv.node_mem_start(nid) \
-        : (0UL))
-#define node_mem_size(nid)             \
-        (alpha_mv.node_mem_size        \
-        ? alpha_mv.node_mem_size(nid)  \
-        : ((nid) ? (0UL) : (~0UL)))
-
-#define pa_to_nid(pa)          alpha_pa_to_nid(pa)
-#define NODE_DATA(nid)         (&node_data[(nid)])
-
-#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
-
-#if 1
-#define PLAT_NODE_DATA_LOCALNR(p, n)   \
-       (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
-#else
-static inline unsigned long
-PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
-{
-       unsigned long temp;
-       temp = p >> PAGE_SHIFT;
-       return temp - PLAT_NODE_DATA(n)->gendata.node_start_pfn;
-}
-#endif
-
-/*
- * Following are macros that each numa implementation must define.
- */
-
-/*
- * Given a kernel address, find the home node of the underlying memory.
- */
-#define kvaddr_to_nid(kaddr)   pa_to_nid(__pa(kaddr))
-
-/*
- * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
- * and returns the kaddr corresponding to first physical page in the
- * node's mem_map.
- */
-#define LOCAL_BASE_ADDR(kaddr)                                           \
-    ((unsigned long)__va(NODE_DATA(kvaddr_to_nid(kaddr))->node_start_pfn  \
-                        << PAGE_SHIFT))
-
-/* XXX: FIXME -- nyc */
-#define kern_addr_valid(kaddr) (0)
-
-#define mk_pte(page, pgprot)                                                \
-({                                                                          \
-       pte_t pte;                                                           \
-       unsigned long pfn;                                                   \
-                                                                            \
-       pfn = page_to_pfn(page) << 32; \
-       pte_val(pte) = pfn | pgprot_val(pgprot);                             \
-                                                                            \
-       pte;                                                                 \
-})
-
-#define pte_page(x)                                                    \
-({                                                                     \
-               unsigned long kvirt;                                            
\
-       struct page * __xx;                                             \
-                                                                       \
-       kvirt = (unsigned long)__va(pte_val(x) >> (32-PAGE_SHIFT));       \
-       __xx = virt_to_page(kvirt);                                     \
-                                                                       \
-       __xx;                                                           \
-})
-
-#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)))                                   
\
-
-#endif /* CONFIG_DISCONTIGMEM */
-
-#endif /* _ASM_MMZONE_H_ */
diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h
index 8d856c62e22a..e1757b7cfe3d 100644
--- a/arch/alpha/include/asm/pgtable.h
+++ b/arch/alpha/include/asm/pgtable.h
@@ -206,7 +206,6 @@ extern unsigned long __zero_page(void);
  #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)                                          \
  ({                                                                    \
@@ -215,7 +214,6 @@ extern unsigned long __zero_page(void);
        pte_val(pte) = (page_to_pfn(page) << 32) | pgprot_val(pgprot);    \
        pte;                                                            \
  })
-#endif
extern inline pte_t pfn_pte(unsigned long physpfn, pgprot_t pgprot)
  { pte_t pte; pte_val(pte) = (PHYS_TWIDDLE(physpfn) << 32) | 
pgprot_val(pgprot); return pte; }
@@ -330,9 +328,7 @@ extern inline pte_t mk_swap_pte(unsigned long type, 
unsigned long offset)
  #define __pte_to_swp_entry(pte)       ((swp_entry_t) { pte_val(pte) })
  #define __swp_entry_to_pte(x) ((pte_t) { (x).val })
-#ifndef CONFIG_DISCONTIGMEM
  #define kern_addr_valid(addr) (1)
-#endif
#define pte_ERROR(e) \
        printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
diff --git a/arch/alpha/include/asm/topology.h 
b/arch/alpha/include/asm/topology.h
index 5a77a40567fa..7d393036aa8f 100644
--- a/arch/alpha/include/asm/topology.h
+++ b/arch/alpha/include/asm/topology.h
@@ -7,45 +7,6 @@
  #include <linux/numa.h>
  #include <asm/machvec.h>
-#ifdef CONFIG_NUMA
-static inline int cpu_to_node(int cpu)
-{
-       int node;
-       
-       if (!alpha_mv.cpuid_to_nid)
-               return 0;
-
-       node = alpha_mv.cpuid_to_nid(cpu);
-
-#ifdef DEBUG_NUMA
-       BUG_ON(node < 0);
-#endif
-
-       return node;
-}
-
-extern struct cpumask node_to_cpumask_map[];
-/* FIXME: This is dumb, recalculating every time.  But simple. */
-static const struct cpumask *cpumask_of_node(int node)
-{
-       int cpu;
-
-       if (node == NUMA_NO_NODE)
-               return cpu_all_mask;
-
-       cpumask_clear(&node_to_cpumask_map[node]);
-
-       for_each_online_cpu(cpu) {
-               if (cpu_to_node(cpu) == node)
-                       cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
-       }
-
-       return &node_to_cpumask_map[node];
-}
-
-#define cpumask_of_pcibus(bus) (cpu_online_mask)
-
-#endif /* !CONFIG_NUMA */
  # include <asm-generic/topology.h>
#endif /* _ASM_ALPHA_TOPOLOGY_H */
diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c
index 4485b77f8658..1efca79ac83c 100644
--- a/arch/alpha/kernel/core_marvel.c
+++ b/arch/alpha/kernel/core_marvel.c
@@ -287,8 +287,7 @@ io7_init_hose(struct io7 *io7, int port)
        /*
         * Set up window 0 for scatter-gather 8MB at 8MB.
         */
-       hose->sg_isa = iommu_arena_new_node(marvel_cpuid_to_nid(io7->pe),
-                                           hose, 0x00800000, 0x00800000, 0);
+       hose->sg_isa = iommu_arena_new_node(0, hose, 0x00800000, 0x00800000, 0);
        hose->sg_isa->align_entry = 8;    /* cache line boundary */
        csrs->POx_WBASE[0].csr =
                hose->sg_isa->dma_base | wbase_m_ena | wbase_m_sg;
@@ -305,8 +304,7 @@ io7_init_hose(struct io7 *io7, int port)
        /*
         * Set up window 2 for scatter-gather (up-to) 1GB at 3GB.
         */
-       hose->sg_pci = iommu_arena_new_node(marvel_cpuid_to_nid(io7->pe),
-                                           hose, 0xc0000000, 0x40000000, 0);
+       hose->sg_pci = iommu_arena_new_node(0, hose, 0xc0000000, 0x40000000, 0);
        hose->sg_pci->align_entry = 8;    /* cache line boundary */
        csrs->POx_WBASE[2].csr =
                hose->sg_pci->dma_base | wbase_m_ena | wbase_m_sg;
@@ -843,53 +841,8 @@ EXPORT_SYMBOL(marvel_ioportmap);
  EXPORT_SYMBOL(marvel_ioread8);
  EXPORT_SYMBOL(marvel_iowrite8);
  #endif
-
-/*
- * NUMA Support
- */
-/**********
- * FIXME - for now each cpu is a node by itself
- *              -- no real support for striped mode
- **********
- */
-int
-marvel_pa_to_nid(unsigned long pa)
-{
-       int cpuid;
- if ((pa >> 43) & 1) /* I/O */
-               cpuid = (~(pa >> 35) & 0xff);
-       else                    /* mem */
-               cpuid = ((pa >> 34) & 0x3) | ((pa >> (37 - 2)) & (0x1f << 2));
-
-       return marvel_cpuid_to_nid(cpuid);
-}
-
-int
-marvel_cpuid_to_nid(int cpuid)
-{
-       return cpuid;
-}
-
-unsigned long
-marvel_node_mem_start(int nid)
-{
-       unsigned long pa;
-
-       pa = (nid & 0x3) | ((nid & (0x1f << 2)) << 1);
-       pa <<= 34;
-
-       return pa;
-}
-
-unsigned long
-marvel_node_mem_size(int nid)
-{
-       return 16UL * 1024 * 1024 * 1024; /* 16GB */
-}
-
-
-/*
+/*
   * AGP GART Support.
   */
  #include <linux/agp_backend.h>
diff --git a/arch/alpha/kernel/core_wildfire.c 
b/arch/alpha/kernel/core_wildfire.c
index e8d3b033018d..3a804b67f9da 100644
--- a/arch/alpha/kernel/core_wildfire.c
+++ b/arch/alpha/kernel/core_wildfire.c
@@ -434,39 +434,12 @@ wildfire_write_config(struct pci_bus *bus, unsigned int 
devfn, int where,
        return PCIBIOS_SUCCESSFUL;
  }
-struct pci_ops wildfire_pci_ops =
+struct pci_ops wildfire_pci_ops =
  {
        .read =         wildfire_read_config,
        .write =        wildfire_write_config,
  };
-
-/*
- * NUMA Support
- */
-int wildfire_pa_to_nid(unsigned long pa)
-{
-       return pa >> 36;
-}
-
-int wildfire_cpuid_to_nid(int cpuid)
-{
-       /* assume 4 CPUs per node */
-       return cpuid >> 2;
-}
-
-unsigned long wildfire_node_mem_start(int nid)
-{
-       /* 64GB per node */
-       return (unsigned long)nid * (64UL * 1024 * 1024 * 1024);
-}
-
-unsigned long wildfire_node_mem_size(int nid)
-{
-       /* 64GB per node */
-       return 64UL * 1024 * 1024 * 1024;
-}
-
  #if DEBUG_DUMP_REGS
static void __init
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c
index d84b19aa8e9d..35d7b3096d6e 100644
--- a/arch/alpha/kernel/pci_iommu.c
+++ b/arch/alpha/kernel/pci_iommu.c
@@ -71,33 +71,6 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, 
dma_addr_t base,
        if (align < mem_size)
                align = mem_size;
-
-#ifdef CONFIG_DISCONTIGMEM
-
-       arena = memblock_alloc_node(sizeof(*arena), align, nid);
-       if (!NODE_DATA(nid) || !arena) {
-               printk("%s: couldn't allocate arena from node %d\n"
-                      "    falling back to system-wide allocation\n",
-                      __func__, nid);
-               arena = memblock_alloc(sizeof(*arena), SMP_CACHE_BYTES);
-               if (!arena)
-                       panic("%s: Failed to allocate %zu bytes\n", __func__,
-                             sizeof(*arena));
-       }
-
-       arena->ptes = memblock_alloc_node(sizeof(*arena), align, nid);
-       if (!NODE_DATA(nid) || !arena->ptes) {
-               printk("%s: couldn't allocate arena ptes from node %d\n"
-                      "    falling back to system-wide allocation\n",
-                      __func__, nid);
-               arena->ptes = memblock_alloc(mem_size, align);
-               if (!arena->ptes)
-                       panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
-                             __func__, mem_size, align);
-       }
-
-#else /* CONFIG_DISCONTIGMEM */
-
        arena = memblock_alloc(sizeof(*arena), SMP_CACHE_BYTES);
        if (!arena)
                panic("%s: Failed to allocate %zu bytes\n", __func__,
@@ -107,8 +80,6 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, 
dma_addr_t base,
                panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
                      __func__, mem_size, align);
-#endif /* CONFIG_DISCONTIGMEM */
-
        spin_lock_init(&arena->lock);
        arena->hose = hose;
        arena->dma_base = base;
diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h
index 701a05090141..5816a31c1b38 100644
--- a/arch/alpha/kernel/proto.h
+++ b/arch/alpha/kernel/proto.h
@@ -49,10 +49,6 @@ extern void marvel_init_arch(void);
  extern void marvel_kill_arch(int);
  extern void marvel_machine_check(unsigned long, unsigned long);
  extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
-extern int marvel_pa_to_nid(unsigned long);
-extern int marvel_cpuid_to_nid(int);
-extern unsigned long marvel_node_mem_start(int);
-extern unsigned long marvel_node_mem_size(int);
  extern struct _alpha_agp_info *marvel_agp_info(void);
  struct io7 *marvel_find_io7(int pe);
  struct io7 *marvel_next_io7(struct io7 *prev);
@@ -101,10 +97,6 @@ extern void wildfire_init_arch(void);
  extern void wildfire_kill_arch(int);
  extern void wildfire_machine_check(unsigned long vector, unsigned long 
la_ptr);
  extern void wildfire_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
-extern int wildfire_pa_to_nid(unsigned long);
-extern int wildfire_cpuid_to_nid(int);
-extern unsigned long wildfire_node_mem_start(int);
-extern unsigned long wildfire_node_mem_size(int);
/* console.c */
  #ifdef CONFIG_VGA_HOSE
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
index 03dda3beb3bd..5f6858e9dc28 100644
--- a/arch/alpha/kernel/setup.c
+++ b/arch/alpha/kernel/setup.c
@@ -79,11 +79,6 @@ int alpha_l3_cacheshape;
  unsigned long alpha_verbose_mcheck = CONFIG_VERBOSE_MCHECK_ON;
  #endif
-#ifdef CONFIG_NUMA
-struct cpumask node_to_cpumask_map[MAX_NUMNODES] __read_mostly;
-EXPORT_SYMBOL(node_to_cpumask_map);
-#endif
-
  /* Which processor we booted from.  */
  int boot_cpuid;
@@ -305,7 +300,6 @@ move_initrd(unsigned long mem_limit)
  }
  #endif
-#ifndef CONFIG_DISCONTIGMEM
  static void __init
  setup_memory(void *kernel_end)
  {
@@ -389,9 +383,6 @@ setup_memory(void *kernel_end)
        }
  #endif /* CONFIG_BLK_DEV_INITRD */
  }
-#else
-extern void setup_memory(void *);
-#endif /* !CONFIG_DISCONTIGMEM */
int __init
  page_is_ram(unsigned long pfn)
@@ -618,13 +609,6 @@ setup_arch(char **cmdline_p)
               "VERBOSE_MCHECK "
  #endif
-#ifdef CONFIG_DISCONTIGMEM
-              "DISCONTIGMEM "
-#ifdef CONFIG_NUMA
-              "NUMA "
-#endif
-#endif
-
  #ifdef CONFIG_DEBUG_SPINLOCK
               "DEBUG_SPINLOCK "
  #endif
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c
index 83d6c53d6d4d..1f99b03effc2 100644
--- a/arch/alpha/kernel/sys_marvel.c
+++ b/arch/alpha/kernel/sys_marvel.c
@@ -461,10 +461,5 @@ struct alpha_machine_vector marvel_ev7_mv __initmv = {
        .kill_arch              = marvel_kill_arch,
        .pci_map_irq            = marvel_map_irq,
        .pci_swizzle            = common_swizzle,
-
-       .pa_to_nid              = marvel_pa_to_nid,
-       .cpuid_to_nid           = marvel_cpuid_to_nid,
-       .node_mem_start         = marvel_node_mem_start,
-       .node_mem_size          = marvel_node_mem_size,
  };
  ALIAS_MV(marvel_ev7)
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c
index 2c54d707142a..3cee05443f07 100644
--- a/arch/alpha/kernel/sys_wildfire.c
+++ b/arch/alpha/kernel/sys_wildfire.c
@@ -337,10 +337,5 @@ struct alpha_machine_vector wildfire_mv __initmv = {
        .kill_arch              = wildfire_kill_arch,
        .pci_map_irq            = wildfire_map_irq,
        .pci_swizzle            = common_swizzle,
-
-       .pa_to_nid              = wildfire_pa_to_nid,
-       .cpuid_to_nid           = wildfire_cpuid_to_nid,
-       .node_mem_start         = wildfire_node_mem_start,
-       .node_mem_size          = wildfire_node_mem_size,
  };
  ALIAS_MV(wildfire)
diff --git a/arch/alpha/mm/Makefile b/arch/alpha/mm/Makefile
index 08ac6612edad..bd770302eb82 100644
--- a/arch/alpha/mm/Makefile
+++ b/arch/alpha/mm/Makefile
@@ -6,5 +6,3 @@
  ccflags-y := -Werror
obj-y := init.o fault.o
-
-obj-$(CONFIG_DISCONTIGMEM) += numa.o
diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c
index a97650a618f1..f6114d03357c 100644
--- a/arch/alpha/mm/init.c
+++ b/arch/alpha/mm/init.c
@@ -235,8 +235,6 @@ callback_init(void * kernel_end)
        return kernel_end;
  }
-
-#ifndef CONFIG_DISCONTIGMEM
  /*
   * paging_init() sets up the memory map.
   */
@@ -257,7 +255,6 @@ void __init paging_init(void)
        /* Initialize the kernel's ZERO_PGE. */
        memset((void *)ZERO_PGE, 0, PAGE_SIZE);
  }
-#endif /* CONFIG_DISCONTIGMEM */
#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM)
  void
diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c
deleted file mode 100644
index 0636e254a22f..000000000000
--- a/arch/alpha/mm/numa.c
+++ /dev/null
@@ -1,223 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- *  linux/arch/alpha/mm/numa.c
- *
- *  DISCONTIGMEM NUMA alpha support.
- *
- *  Copyright (C) 2001 Andrea Arcangeli <and...@suse.de> SuSE
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/memblock.h>
-#include <linux/swap.h>
-#include <linux/initrd.h>
-#include <linux/pfn.h>
-#include <linux/module.h>
-
-#include <asm/hwrpb.h>
-#include <asm/sections.h>
-
-pg_data_t node_data[MAX_NUMNODES];
-EXPORT_SYMBOL(node_data);
-
-#undef DEBUG_DISCONTIG
-#ifdef DEBUG_DISCONTIG
-#define DBGDCONT(args...) printk(args)
-#else
-#define DBGDCONT(args...)
-#endif
-
-#define for_each_mem_cluster(memdesc, _cluster, i)             \
-       for ((_cluster) = (memdesc)->cluster, (i) = 0;               \
-            (i) < (memdesc)->numclusters; (i)++, (_cluster)++)
-
-static void __init show_mem_layout(void)
-{
-       struct memclust_struct * cluster;
-       struct memdesc_struct * memdesc;
-       int i;
-
-       /* Find free clusters, and init and free the bootmem accordingly.  */
-       memdesc = (struct memdesc_struct *)
-         (hwrpb->mddt_offset + (unsigned long) hwrpb);
-
-       printk("Raw memory layout:\n");
-       for_each_mem_cluster(memdesc, cluster, i) {
-               printk(" memcluster %2d, usage %1lx, start %8lu, end %8lu\n",
-                      i, cluster->usage, cluster->start_pfn,
-                      cluster->start_pfn + cluster->numpages);
-       }
-}
-
-static void __init
-setup_memory_node(int nid, void *kernel_end)
-{
-       extern unsigned long mem_size_limit;
-       struct memclust_struct * cluster;
-       struct memdesc_struct * memdesc;
-       unsigned long start_kernel_pfn, end_kernel_pfn;
-       unsigned long start, end;
-       unsigned long node_pfn_start, node_pfn_end;
-       unsigned long node_min_pfn, node_max_pfn;
-       int i;
-       int show_init = 0;
-
-       /* Find the bounds of current node */
-       node_pfn_start = (node_mem_start(nid)) >> PAGE_SHIFT;
-       node_pfn_end = node_pfn_start + (node_mem_size(nid) >> PAGE_SHIFT);
-       
-       /* Find free clusters, and init and free the bootmem accordingly.  */
-       memdesc = (struct memdesc_struct *)
-         (hwrpb->mddt_offset + (unsigned long) hwrpb);
-
-       /* find the bounds of this node (node_min_pfn/node_max_pfn) */
-       node_min_pfn = ~0UL;
-       node_max_pfn = 0UL;
-       for_each_mem_cluster(memdesc, cluster, i) {
-               /* Bit 0 is console/PALcode reserved.  Bit 1 is
-                  non-volatile memory -- we might want to mark
-                  this for later.  */
-               if (cluster->usage & 3)
-                       continue;
-
-               start = cluster->start_pfn;
-               end = start + cluster->numpages;
-
-               if (start >= node_pfn_end || end <= node_pfn_start)
-                       continue;
-
-               if (!show_init) {
-                       show_init = 1;
-                       printk("Initializing bootmem allocator on Node ID 
%d\n", nid);
-               }
-               printk(" memcluster %2d, usage %1lx, start %8lu, end %8lu\n",
-                      i, cluster->usage, cluster->start_pfn,
-                      cluster->start_pfn + cluster->numpages);
-
-               if (start < node_pfn_start)
-                       start = node_pfn_start;
-               if (end > node_pfn_end)
-                       end = node_pfn_end;
-
-               if (start < node_min_pfn)
-                       node_min_pfn = start;
-               if (end > node_max_pfn)
-                       node_max_pfn = end;
-       }
-
-       if (mem_size_limit && node_max_pfn > mem_size_limit) {
-               static int msg_shown = 0;
-               if (!msg_shown) {
-                       msg_shown = 1;
-                       printk("setup: forcing memory size to %ldK (from 
%ldK).\n",
-                              mem_size_limit << (PAGE_SHIFT - 10),
-                              node_max_pfn    << (PAGE_SHIFT - 10));
-               }
-               node_max_pfn = mem_size_limit;
-       }
-
-       if (node_min_pfn >= node_max_pfn)
-               return;
-
-       /* Update global {min,max}_low_pfn from node information. */
-       if (node_min_pfn < min_low_pfn)
-               min_low_pfn = node_min_pfn;
-       if (node_max_pfn > max_low_pfn)
-               max_pfn = max_low_pfn = node_max_pfn;
-
-#if 0 /* we'll try this one again in a little while */
-       /* Cute trick to make sure our local node data is on local memory */
-       node_data[nid] = (pg_data_t *)(__va(node_min_pfn << PAGE_SHIFT));
-#endif
-       printk(" Detected node memory:   start %8lu, end %8lu\n",
-              node_min_pfn, node_max_pfn);
-
-       DBGDCONT(" DISCONTIG: node_data[%d]   is at 0x%p\n", nid, 
NODE_DATA(nid));
-
-       /* Find the bounds of kernel memory.  */
-       start_kernel_pfn = PFN_DOWN(KERNEL_START_PHYS);
-       end_kernel_pfn = PFN_UP(virt_to_phys(kernel_end));
-
-       if (!nid && (node_max_pfn < end_kernel_pfn || node_min_pfn > 
start_kernel_pfn))
-               panic("kernel loaded out of ram");
-
-       memblock_add_node(PFN_PHYS(node_min_pfn),
-                         (node_max_pfn - node_min_pfn) << PAGE_SHIFT, nid);
-
-       /* Zone start phys-addr must be 2^(MAX_ORDER-1) aligned.
-          Note that we round this down, not up - node memory
-          has much larger alignment than 8Mb, so it's safe. */
-       node_min_pfn &= ~((1UL << (MAX_ORDER-1))-1);
-
-       NODE_DATA(nid)->node_start_pfn = node_min_pfn;
-       NODE_DATA(nid)->node_present_pages = node_max_pfn - node_min_pfn;
-
-       node_set_online(nid);
-}
-
-void __init
-setup_memory(void *kernel_end)
-{
-       unsigned long kernel_size;
-       int nid;
-
-       show_mem_layout();
-
-       nodes_clear(node_online_map);
-
-       min_low_pfn = ~0UL;
-       max_low_pfn = 0UL;
-       for (nid = 0; nid < MAX_NUMNODES; nid++)
-               setup_memory_node(nid, kernel_end);
-
-       kernel_size = virt_to_phys(kernel_end) - KERNEL_START_PHYS;
-       memblock_reserve(KERNEL_START_PHYS, kernel_size);
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       initrd_start = INITRD_START;
-       if (initrd_start) {
-               extern void *move_initrd(unsigned long);
-
-               initrd_end = initrd_start+INITRD_SIZE;
-               printk("Initial ramdisk at: 0x%p (%lu bytes)\n",
-                      (void *) initrd_start, INITRD_SIZE);
-
-               if ((void *)initrd_end > phys_to_virt(PFN_PHYS(max_low_pfn))) {
-                       if (!move_initrd(PFN_PHYS(max_low_pfn)))
-                               printk("initrd extends beyond end of memory "
-                                      "(0x%08lx > 0x%p)\ndisabling initrd\n",
-                                      initrd_end,
-                                      phys_to_virt(PFN_PHYS(max_low_pfn)));
-               } else {
-                       nid = kvaddr_to_nid(initrd_start);
-                       memblock_reserve(virt_to_phys((void *)initrd_start),
-                                        INITRD_SIZE);
-               }
-       }
-#endif /* CONFIG_BLK_DEV_INITRD */
-}
-
-void __init paging_init(void)
-{
-       unsigned long   max_zone_pfn[MAX_NR_ZONES] = {0, };
-       unsigned long   dma_local_pfn;
-
-       /*
-        * The old global MAX_DMA_ADDRESS per-arch API doesn't fit
-        * in the NUMA model, for now we convert it to a pfn and
-        * we interpret this pfn as a local per-node information.
-        * This issue isn't very important since none of these machines
-        * have legacy ISA slots anyways.
-        */
-       dma_local_pfn = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-
-       max_zone_pfn[ZONE_DMA] = dma_local_pfn;
-       max_zone_pfn[ZONE_NORMAL] = max_pfn;
-
-       free_area_init(max_zone_pfn);
-
-       /* Initialize the kernel's ZERO_PGE. */
-       memset((void *)ZERO_PGE, 0, PAGE_SIZE);
-}


Acked-by: David Hildenbrand <da...@redhat.com>

--
Thanks,

David / dhildenb

Reply via email to