diff options
author | David S. Miller <davem@davemloft.net> | 2012-04-25 16:13:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-26 23:02:23 -0400 |
commit | 625d693e9784f988371e69c2b41a2172c0be6c11 (patch) | |
tree | f858bdd04b75745adcc347ba3fc0323e5f263f30 | |
parent | 8fe5f56c8a203a7a83d1b621c369655d914f3752 (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/Kconfig | 1 | ||||
-rw-r--r-- | arch/sparc/mm/init_64.c | 91 |
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 | ||
65 | config ARCH_DEFCONFIG | 66 | config 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) | |||
741 | struct node_mem_mask { | 741 | struct 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 | }; |
746 | static struct node_mem_mask node_masks[MAX_NUMNODES]; | 745 | static struct node_mem_mask node_masks[MAX_NUMNODES]; |
747 | static int num_node_masks; | 746 | static int num_node_masks; |
@@ -820,7 +819,7 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid) | |||
820 | */ | 819 | */ |
821 | static void __init allocate_node_data(int nid) | 820 | static 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 | ||
857 | static void init_node_masks_nonnuma(void) | 844 | static 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 | ||
1295 | static 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 | |||
1318 | static 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 | |||
1328 | static 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 | |||
1360 | static unsigned long __init bootmem_init(unsigned long phys_base) | 1282 | static 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(); |