
From: Anton Blanchard <anton@samba.org>

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: Nathan Lynch <nathanl@austin.ibm.com>
Acked-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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)
_
