sparc64: Convert over to NO_BOOTMEM.
authorDavid S. Miller <davem@davemloft.net>
Wed, 25 Apr 2012 20:13:43 +0000 (13:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Apr 2012 03:02:23 +0000 (20:02 -0700)
With help from Sam Ravnborg.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/Kconfig
arch/sparc/mm/init_64.c

index db4e821..6335849 100644 (file)
@@ -61,6 +61,7 @@ config SPARC64
        select IRQ_PREFLOW_FASTEOI
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select HAVE_C_RECORDMCOUNT
+       select NO_BOOTMEM
 
 config ARCH_DEFCONFIG
        string
index 21faaee..5b84559 100644 (file)
@@ -741,7 +741,6 @@ static void __init find_ramdisk(unsigned long phys_base)
 struct node_mem_mask {
        unsigned long mask;
        unsigned long val;
-       unsigned long bootmem_paddr;
 };
 static struct node_mem_mask node_masks[MAX_NUMNODES];
 static int num_node_masks;
@@ -820,7 +819,7 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid)
  */
 static void __init allocate_node_data(int nid)
 {
-       unsigned long paddr, num_pages, start_pfn, end_pfn;
+       unsigned long paddr, start_pfn, end_pfn;
        struct pglist_data *p;
 
 #ifdef CONFIG_NEED_MULTIPLE_NODES
@@ -832,7 +831,7 @@ static void __init allocate_node_data(int nid)
        NODE_DATA(nid) = __va(paddr);
        memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
 
-       NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
+       NODE_DATA(nid)->node_id = nid;
 #endif
 
        p = NODE_DATA(nid);
@@ -840,18 +839,6 @@ static void __init allocate_node_data(int nid)
        get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
        p->node_start_pfn = start_pfn;
        p->node_spanned_pages = end_pfn - start_pfn;
-
-       if (p->node_spanned_pages) {
-               num_pages = bootmem_bootmap_pages(p->node_spanned_pages);
-
-               paddr = memblock_alloc_try_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid);
-               if (!paddr) {
-                       prom_printf("Cannot allocate bootmap for nid[%d]\n",
-                                 nid);
-                       prom_halt();
-               }
-               node_masks[nid].bootmem_paddr = paddr;
-       }
 }
 
 static void init_node_masks_nonnuma(void)
@@ -1292,75 +1279,9 @@ static void __init bootmem_init_nonnuma(void)
        node_set_online(0);
 }
 
-static void __init reserve_range_in_node(int nid, unsigned long start,
-                                        unsigned long end)
-{
-       numadbg("    reserve_range_in_node(nid[%d],start[%lx],end[%lx]\n",
-               nid, start, end);
-       while (start < end) {
-               unsigned long this_end;
-               int n;
-
-               this_end = memblock_nid_range(start, end, &n);
-               if (n == nid) {
-                       numadbg("      MATCH reserving range [%lx:%lx]\n",
-                               start, this_end);
-                       reserve_bootmem_node(NODE_DATA(nid), start,
-                                            (this_end - start), BOOTMEM_DEFAULT);
-               } else
-                       numadbg("      NO MATCH, advancing start to %lx\n",
-                               this_end);
-
-               start = this_end;
-       }
-}
-
-static void __init trim_reserved_in_node(int nid)
-{
-       struct memblock_region *reg;
-
-       numadbg("  trim_reserved_in_node(%d)\n", nid);
-
-       for_each_memblock(reserved, reg)
-               reserve_range_in_node(nid, reg->base, reg->base + reg->size);
-}
-
-static void __init bootmem_init_one_node(int nid)
-{
-       struct pglist_data *p;
-
-       numadbg("bootmem_init_one_node(%d)\n", nid);
-
-       p = NODE_DATA(nid);
-
-       if (p->node_spanned_pages) {
-               unsigned long paddr = node_masks[nid].bootmem_paddr;
-               unsigned long end_pfn;
-
-               end_pfn = p->node_start_pfn + p->node_spanned_pages;
-
-               numadbg("  init_bootmem_node(%d, %lx, %lx, %lx)\n",
-                       nid, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn);
-
-               init_bootmem_node(p, paddr >> PAGE_SHIFT,
-                                 p->node_start_pfn, end_pfn);
-
-               numadbg("  free_bootmem_with_active_regions(%d, %lx)\n",
-                       nid, end_pfn);
-               free_bootmem_with_active_regions(nid, end_pfn);
-
-               trim_reserved_in_node(nid);
-
-               numadbg("  sparse_memory_present_with_active_regions(%d)\n",
-                       nid);
-               sparse_memory_present_with_active_regions(nid);
-       }
-}
-
 static unsigned long __init bootmem_init(unsigned long phys_base)
 {
        unsigned long end_pfn;
-       int nid;
 
        end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
        max_pfn = max_low_pfn = end_pfn;
@@ -1369,11 +1290,12 @@ static unsigned long __init bootmem_init(unsigned long phys_base)
        if (bootmem_init_numa() < 0)
                bootmem_init_nonnuma();
 
-       /* XXX cpu notifier XXX */
+       /* Dump memblock with node info. */
+       memblock_dump_all();
 
-       for_each_online_node(nid)
-               bootmem_init_one_node(nid);
+       /* XXX cpu notifier XXX */
 
+       sparse_memory_present_with_active_regions(MAX_NUMNODES);
        sparse_init();
 
        return end_pfn;
@@ -1973,6 +1895,7 @@ void __init mem_init(void)
                                        free_all_bootmem_node(NODE_DATA(i));
                        }
                }
+               totalram_pages += free_low_memory_core_early(MAX_NUMNODES);
        }
 #else
        totalram_pages = free_all_bootmem();