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>

Index: linux/arch/x86_64/mm/srat.c
===================================================================
--- linux.orig/arch/x86_64/mm/srat.c
+++ linux/arch/x86_64/mm/srat.c
@@ -25,6 +25,8 @@ static nodemask_t nodes_found __initdata
 static struct node nodes[MAX_NUMNODES] __initdata;
 static __u8  pxm2node[256] = { [0 ... 255] = 0xff };
 
+int node_to_pxm(int n);
+
 int pxm_to_node(int pxm)
 {
 	if ((unsigned)pxm >= 256) 
@@ -53,9 +55,9 @@ static __init int conflicting_nodes(unsi
 		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 @@ acpi_numa_memory_affinity_init(struct ac
 		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;
 	}