Commit 6ac5fff1 authored by Anton Blanchard's avatar Anton Blanchard Committed by Linus Torvalds

[PATCH] ppc64: Make NUMA code handle unexpected layouts

From: Nathan Lynch <nathanl@austin.ibm.com>

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: default avatarNathan Lynch <nathanl@austin.ibm.com>
Acked-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3d311cb2
...@@ -345,8 +345,6 @@ static int __init parse_numa_properties(void) ...@@ -345,8 +345,6 @@ static int __init parse_numa_properties(void)
numa_domain = 0; numa_domain = 0;
} }
node_set_online(numa_domain);
if (max_domain < numa_domain) if (max_domain < numa_domain)
max_domain = numa_domain; max_domain = numa_domain;
...@@ -361,14 +359,19 @@ static int __init parse_numa_properties(void) ...@@ -361,14 +359,19 @@ static int __init parse_numa_properties(void)
init_node_data[numa_domain].node_start_pfn + init_node_data[numa_domain].node_start_pfn +
init_node_data[numa_domain].node_spanned_pages; init_node_data[numa_domain].node_spanned_pages;
if (shouldstart != (start / PAGE_SIZE)) { if (shouldstart != (start / PAGE_SIZE)) {
printk(KERN_ERR "WARNING: Hole in node, " /* Revert to non-numa for now */
"disabling region start %lx " printk(KERN_ERR
"length %lx\n", start, size); "WARNING: Unexpected node layout: "
continue; "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 += init_node_data[numa_domain].node_spanned_pages +=
size / PAGE_SIZE; size / PAGE_SIZE;
} else { } else {
node_set_online(numa_domain);
init_node_data[numa_domain].node_start_pfn = init_node_data[numa_domain].node_start_pfn =
start / PAGE_SIZE; start / PAGE_SIZE;
init_node_data[numa_domain].node_spanned_pages = init_node_data[numa_domain].node_spanned_pages =
...@@ -388,6 +391,14 @@ static int __init parse_numa_properties(void) ...@@ -388,6 +391,14 @@ static int __init parse_numa_properties(void)
node_set_online(i); node_set_online(i);
return 0; 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) static void __init setup_nonnuma(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment