git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] x86-64: Improve error handling for overlapping PXMs in SRAT.
[pandora-kernel.git]
/
arch
/
x86_64
/
mm
/
srat.c
diff --git
a/arch/x86_64/mm/srat.c
b/arch/x86_64/mm/srat.c
index
8e3d097
..
36bc7be
100644
(file)
--- a/
arch/x86_64/mm/srat.c
+++ b/
arch/x86_64/mm/srat.c
@@
-20,14
+20,20
@@
static struct acpi_table_slit *acpi_slit;
static struct acpi_table_slit *acpi_slit;
-/* Internal processor count */
-static unsigned int __initdata num_processors = 0;
-
static nodemask_t nodes_parsed __initdata;
static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata;
static __u8 pxm2node[256] = { [0 ... 255] = 0xff };
static nodemask_t nodes_parsed __initdata;
static nodemask_t nodes_found __initdata;
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)
+ return 0;
+ return pxm2node[pxm];
+}
+
static __init int setup_node(int pxm)
{
unsigned node = pxm2node[pxm];
static __init int setup_node(int pxm)
{
unsigned node = pxm2node[pxm];
@@
-49,9
+55,9
@@
static __init int conflicting_nodes(unsigned long start, unsigned long end)
if (nd->start == nd->end)
continue;
if (nd->end > start && nd->start < end)
if (nd->start == nd->end)
continue;
if (nd->end > start && nd->start < end)
- return
1
;
+ return
i
;
if (nd->end == end && nd->start == start)
if (nd->end == end && nd->start == start)
- return
1
;
+ return
i
;
}
return -1;
}
}
return -1;
}
@@
-104,18
+110,10
@@
acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
bad_srat();
return;
}
bad_srat();
return;
}
- if (num_processors >= NR_CPUS) {
- printk(KERN_ERR "SRAT: Processor #%d (lapic %u) INVALID. (Max ID: %d).\n",
- num_processors, pa->apic_id, NR_CPUS);
- bad_srat();
- return;
- }
- cpu_to_node[num_processors] = node;
+ apicid_to_node[pa->apic_id] = node;
acpi_numa = 1;
acpi_numa = 1;
- printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> CPU %u -> Node %u\n",
- pxm, pa->apic_id, num_processors, node);
-
- num_processors++;
+ printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
+ pxm, pa->apic_id, node);
}
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
}
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
@@
-143,10
+141,15
@@
acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
printk(KERN_INFO "SRAT: hot plug zone found %lx - %lx \n",
start, end);
i = conflicting_nodes(start, end);
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
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;
}
bad_srat();
return;
}
@@
-201,7
+204,7
@@
int __init acpi_scan_nodes(unsigned long start, unsigned long end)
return 0;
}
return 0;
}
-int node_to_pxm(int n)
+
static
int node_to_pxm(int n)
{
int i;
if (pxm2node[n] == n)
{
int i;
if (pxm2node[n] == n)