Commit 0b07e984 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] x86-64: Don't assign CPU numbers in SRAT parsing

Do that later when the CPU boots. SRAT just stores the APIC<->Node
mapping node. This fixes problems on systems where the order
of SRAT entries does not match the MADT.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f1f4e83f
...@@ -765,6 +765,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) ...@@ -765,6 +765,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
int cpu = smp_processor_id(); int cpu = smp_processor_id();
int node = 0; int node = 0;
unsigned bits; unsigned bits;
unsigned apicid = phys_proc_id[cpu];
bits = 0; bits = 0;
while ((1 << bits) < c->x86_num_cores) while ((1 << bits) < c->x86_num_cores)
...@@ -777,15 +778,19 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) ...@@ -777,15 +778,19 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
/* When an ACPI SRAT table is available use the mappings from SRAT /* When an ACPI SRAT table is available use the mappings from SRAT
instead. */ instead. */
if (acpi_numa <= 0) { node = phys_proc_id[cpu];
node = phys_proc_id[cpu]; if (acpi_numa > 0) {
if (!node_online(node)) if (apicid_to_node[apicid] != NUMA_NO_NODE)
node = first_node(node_online_map); node = apicid_to_node[apicid];
cpu_to_node[cpu] = node; else
} else { printk(KERN_ERR
node = cpu_to_node[cpu]; "SRAT: Didn't specify node for CPU %d(%d)\n",
cpu, apicid);
} }
if (!node_online(node))
node = first_node(node_online_map);
cpu_to_node[cpu] = node;
#endif #endif
printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n", printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",
......
...@@ -29,6 +29,9 @@ int memnode_shift; ...@@ -29,6 +29,9 @@ int memnode_shift;
u8 memnodemap[NODEMAPSIZE]; u8 memnodemap[NODEMAPSIZE];
unsigned char cpu_to_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = NUMA_NO_NODE }; unsigned char cpu_to_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = NUMA_NO_NODE };
unsigned char apicid_to_node[256] __cpuinitdata = {
[0 ... NR_CPUS-1] = NUMA_NO_NODE
};
cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly; cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly;
int numa_off __initdata; int numa_off __initdata;
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
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_parsed __initdata;
static nodemask_t nodes_found __initdata; static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata; static struct node nodes[MAX_NUMNODES] __initdata;
...@@ -104,18 +101,10 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) ...@@ -104,18 +101,10 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
bad_srat(); bad_srat();
return; return;
} }
if (num_processors >= NR_CPUS) { apicid_to_node[pa->apic_id] = node;
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;
acpi_numa = 1; acpi_numa = 1;
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> CPU %u -> Node %u\n", printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
pxm, pa->apic_id, num_processors, node); pxm, pa->apic_id, node);
num_processors++;
} }
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */ /* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
......
...@@ -16,6 +16,8 @@ extern void numa_add_cpu(int cpu); ...@@ -16,6 +16,8 @@ extern void numa_add_cpu(int cpu);
extern void numa_init_array(void); extern void numa_init_array(void);
extern int numa_off; extern int numa_off;
extern unsigned char apicid_to_node[256];
#define NUMA_NO_NODE 0xff #define NUMA_NO_NODE 0xff
#endif #endif
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