summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-04-25 16:13:43 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-26 23:02:23 -0400
commit625d693e9784f988371e69c2b41a2172c0be6c11 (patch)
treef858bdd04b75745adcc347ba3fc0323e5f263f30
parent8fe5f56c8a203a7a83d1b621c369655d914f3752 (diff)
sparc64: Convert over to NO_BOOTMEM.
With help from Sam Ravnborg. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc/Kconfig1
-rw-r--r--arch/sparc/mm/init_64.c91
2 files changed, 8 insertions, 84 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index db4e821b3ed0..6335849c1547 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -61,6 +61,7 @@ config SPARC64
61 select IRQ_PREFLOW_FASTEOI 61 select IRQ_PREFLOW_FASTEOI
62 select ARCH_HAVE_NMI_SAFE_CMPXCHG 62 select ARCH_HAVE_NMI_SAFE_CMPXCHG
63 select HAVE_C_RECORDMCOUNT 63 select HAVE_C_RECORDMCOUNT
64 select NO_BOOTMEM
64 65
65config ARCH_DEFCONFIG 66config ARCH_DEFCONFIG
66 string 67 string
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index 21faaeea85de..5b845598508c 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -741,7 +741,6 @@ static void __init find_ramdisk(unsigned long phys_base)
741struct node_mem_mask { 741struct node_mem_mask {
742 unsigned long mask; 742 unsigned long mask;
743 unsigned long val; 743 unsigned long val;
744 unsigned long bootmem_paddr;
745}; 744};
746static struct node_mem_mask node_masks[MAX_NUMNODES]; 745static struct node_mem_mask node_masks[MAX_NUMNODES];
747static int num_node_masks; 746static int num_node_masks;
@@ -820,7 +819,7 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid)
820 */ 819 */
821static void __init allocate_node_data(int nid) 820static void __init allocate_node_data(int nid)
822{ 821{
823 unsigned long paddr, num_pages, start_pfn, end_pfn; 822 unsigned long paddr, start_pfn, end_pfn;
824 struct pglist_data *p; 823 struct pglist_data *p;
825 824
826#ifdef CONFIG_NEED_MULTIPLE_NODES 825#ifdef CONFIG_NEED_MULTIPLE_NODES
@@ -832,7 +831,7 @@ static void __init allocate_node_data(int nid)
832 NODE_DATA(nid) = __va(paddr); 831 NODE_DATA(nid) = __va(paddr);
833 memset(NODE_DATA(nid), 0, sizeof(struct pglist_data)); 832 memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
834 833
835 NODE_DATA(nid)->bdata = &bootmem_node_data[nid]; 834 NODE_DATA(nid)->node_id = nid;
836#endif 835#endif
837 836
838 p = NODE_DATA(nid); 837 p = NODE_DATA(nid);
@@ -840,18 +839,6 @@ static void __init allocate_node_data(int nid)
840 get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); 839 get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
841 p->node_start_pfn = start_pfn; 840 p->node_start_pfn = start_pfn;
842 p->node_spanned_pages = end_pfn - start_pfn; 841 p->node_spanned_pages = end_pfn - start_pfn;
843
844 if (p->node_spanned_pages) {
845 num_pages = bootmem_bootmap_pages(p->node_spanned_pages);
846
847 paddr = memblock_alloc_try_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid);
848 if (!paddr) {
849 prom_printf("Cannot allocate bootmap for nid[%d]\n",
850 nid);
851 prom_halt();
852 }
853 node_masks[nid].bootmem_paddr = paddr;
854 }
855} 842}
856 843
857static void init_node_masks_nonnuma(void) 844static void init_node_masks_nonnuma(void)
@@ -1292,75 +1279,9 @@ static void __init bootmem_init_nonnuma(void)
1292 node_set_online(0); 1279 node_set_online(0);
1293} 1280}
1294 1281
1295static void __init reserve_range_in_node(int nid, unsigned long start,
1296 unsigned long end)
1297{
1298 numadbg(" reserve_range_in_node(nid[%d],start[%lx],end[%lx]\n",
1299 nid, start, end);
1300 while (start < end) {
1301 unsigned long this_end;
1302 int n;
1303
1304 this_end = memblock_nid_range(start, end, &n);
1305 if (n == nid) {
1306 numadbg(" MATCH reserving range [%lx:%lx]\n",
1307 start, this_end);
1308 reserve_bootmem_node(NODE_DATA(nid), start,
1309 (this_end - start), BOOTMEM_DEFAULT);
1310 } else
1311 numadbg(" NO MATCH, advancing start to %lx\n",
1312 this_end);
1313
1314 start = this_end;
1315 }
1316}
1317
1318static void __init trim_reserved_in_node(int nid)
1319{
1320 struct memblock_region *reg;
1321
1322 numadbg(" trim_reserved_in_node(%d)\n", nid);
1323
1324 for_each_memblock(reserved, reg)
1325 reserve_range_in_node(nid, reg->base, reg->base + reg->size);
1326}
1327
1328static void __init bootmem_init_one_node(int nid)
1329{
1330 struct pglist_data *p;
1331
1332 numadbg("bootmem_init_one_node(%d)\n", nid);
1333
1334 p = NODE_DATA(nid);
1335
1336 if (p->node_spanned_pages) {
1337 unsigned long paddr = node_masks[nid].bootmem_paddr;
1338 unsigned long end_pfn;
1339
1340 end_pfn = p->node_start_pfn + p->node_spanned_pages;
1341
1342 numadbg(" init_bootmem_node(%d, %lx, %lx, %lx)\n",
1343 nid, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn);
1344
1345 init_bootmem_node(p, paddr >> PAGE_SHIFT,
1346 p->node_start_pfn, end_pfn);
1347
1348 numadbg(" free_bootmem_with_active_regions(%d, %lx)\n",
1349 nid, end_pfn);
1350 free_bootmem_with_active_regions(nid, end_pfn);
1351
1352 trim_reserved_in_node(nid);
1353
1354 numadbg(" sparse_memory_present_with_active_regions(%d)\n",
1355 nid);
1356 sparse_memory_present_with_active_regions(nid);
1357 }
1358}
1359
1360static unsigned long __init bootmem_init(unsigned long phys_base) 1282static unsigned long __init bootmem_init(unsigned long phys_base)
1361{ 1283{
1362 unsigned long end_pfn; 1284 unsigned long end_pfn;
1363 int nid;
1364 1285
1365 end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT; 1286 end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
1366 max_pfn = max_low_pfn = end_pfn; 1287 max_pfn = max_low_pfn = end_pfn;
@@ -1369,11 +1290,12 @@ static unsigned long __init bootmem_init(unsigned long phys_base)
1369 if (bootmem_init_numa() < 0) 1290 if (bootmem_init_numa() < 0)
1370 bootmem_init_nonnuma(); 1291 bootmem_init_nonnuma();
1371 1292
1372 /* XXX cpu notifier XXX */ 1293 /* Dump memblock with node info. */
1294 memblock_dump_all();
1373 1295
1374 for_each_online_node(nid) 1296 /* XXX cpu notifier XXX */
1375 bootmem_init_one_node(nid);
1376 1297
1298 sparse_memory_present_with_active_regions(MAX_NUMNODES);
1377 sparse_init(); 1299 sparse_init();
1378 1300
1379 return end_pfn; 1301 return end_pfn;
@@ -1973,6 +1895,7 @@ void __init mem_init(void)
1973 free_all_bootmem_node(NODE_DATA(i)); 1895 free_all_bootmem_node(NODE_DATA(i));
1974 } 1896 }
1975 } 1897 }
1898 totalram_pages += free_low_memory_core_early(MAX_NUMNODES);
1976 } 1899 }
1977#else 1900#else
1978 totalram_pages = free_all_bootmem(); 1901 totalram_pages = free_all_bootmem();