[PATCH] x86-64: Improve error handling for overlapping PXMs in SRAT.

- Report PXMs instead of nodes
- Report the correct PXM, not always the one of node 1.
- Only warn for the case of a PXM overlapping by itself

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c
index db6b073..36bc7be 100644
--- a/arch/x86_64/mm/srat.c
+++ b/arch/x86_64/mm/srat.c
@@ -25,6 +25,8 @@
 static struct node nodes[MAX_NUMNODES] __initdata;
 static __u8  pxm2node[256] = { [0 ... 255] = 0xff };
 
+static int node_to_pxm(int n);
+
 int pxm_to_node(int pxm)
 {
 	if ((unsigned)pxm >= 256)
@@ -53,9 +55,9 @@
 		if (nd->start == nd->end)
 			continue;
 		if (nd->end > start && nd->start < end)
-			return 1;
+			return i;
 		if (nd->end == end && nd->start == start)
-			return 1;
+			return i;
 	}
 	return -1;
 }
@@ -139,10 +141,15 @@
 		printk(KERN_INFO "SRAT: hot plug zone found %lx - %lx \n",
 				start, end);
 	i = conflicting_nodes(start, end);
-	if (i >= 0) {
+	if (i == node) {
+		printk(KERN_WARNING
+		"SRAT: Warning: PXM %d (%lx-%lx) overlaps with itself (%Lx-%Lx)\n",
+			pxm, start, end, nodes[i].start, nodes[i].end);
+	} else if (i >= 0) {
 		printk(KERN_ERR
-		       "SRAT: pxm %d overlap %lx-%lx with node %d(%Lx-%Lx)\n",
-		       pxm, start, end, i, nodes[i].start, nodes[i].end);
+		       "SRAT: PXM %d (%lx-%lx) overlaps with PXM %d (%Lx-%Lx)\n",
+		       pxm, start, end, node_to_pxm(i),
+			nodes[i].start, nodes[i].end);
 		bad_srat();
 		return;
 	}
@@ -197,7 +204,7 @@
 	return 0;
 }
 
-int node_to_pxm(int n)
+static int node_to_pxm(int n)
 {
        int i;
        if (pxm2node[n] == n)