From: Anton Blanchard From: Nathan Lynch Ran into this on a 4GB partition - all but about ~300MB was thrown away. It works for me, but I've not tested on firmware without the bug. Fall back to non-numa setup upon discovering unexpected memory layout as presented by firmware, instead of throwing away regions. Signed-off-by: Nathan Lynch Acked-by: Anton Blanchard Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/mm/numa.c | 23 +++++++++++++++++------ 1 files changed, 17 insertions(+), 6 deletions(-) diff -puN arch/ppc64/mm/numa.c~ppc64-make-numa-code-handle-unexpected-layouts arch/ppc64/mm/numa.c --- 25/arch/ppc64/mm/numa.c~ppc64-make-numa-code-handle-unexpected-layouts 2005-01-10 20:02:12.325441040 -0800 +++ 25-akpm/arch/ppc64/mm/numa.c 2005-01-10 20:02:12.329440432 -0800 @@ -345,8 +345,6 @@ new_range: numa_domain = 0; } - node_set_online(numa_domain); - if (max_domain < numa_domain) max_domain = numa_domain; @@ -361,14 +359,19 @@ new_range: init_node_data[numa_domain].node_start_pfn + init_node_data[numa_domain].node_spanned_pages; if (shouldstart != (start / PAGE_SIZE)) { - printk(KERN_ERR "WARNING: Hole in node, " - "disabling region start %lx " - "length %lx\n", start, size); - continue; + /* Revert to non-numa for now */ + printk(KERN_ERR + "WARNING: Unexpected node layout: " + "region start %lx length %lx\n", + start, size); + printk(KERN_ERR "NUMA is disabled\n"); + goto err; } init_node_data[numa_domain].node_spanned_pages += size / PAGE_SIZE; } else { + node_set_online(numa_domain); + init_node_data[numa_domain].node_start_pfn = start / PAGE_SIZE; init_node_data[numa_domain].node_spanned_pages = @@ -388,6 +391,14 @@ new_range: node_set_online(i); return 0; +err: + /* Something has gone wrong; revert any setup we've done */ + for_each_node(i) { + node_set_offline(i); + init_node_data[i].node_start_pfn = 0; + init_node_data[i].node_spanned_pages = 0; + } + return -1; } static void __init setup_nonnuma(void) _