diff options
author | Andi Kleen <ak@suse.de> | 2005-09-12 20:49:24 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-12 21:49:55 +0400 |
commit | 0b07e984fc7a51b1a7c75e1bfdcf59d1ad065353 (patch) | |
tree | 84477039c897553359694020e767638a830f4f15 | |
parent | f1f4e83fd9b5ce77d05825586d0426a54b8f3a68 (diff) | |
download | linux-0b07e984fc7a51b1a7c75e1bfdcf59d1ad065353.tar.xz |
[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: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/x86_64/kernel/setup.c | 21 | ||||
-rw-r--r-- | arch/x86_64/mm/numa.c | 3 | ||||
-rw-r--r-- | arch/x86_64/mm/srat.c | 17 | ||||
-rw-r--r-- | include/asm-x86_64/numa.h | 2 |
4 files changed, 21 insertions, 22 deletions
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 9aec524be3eb..976ebcf96f3e 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c @@ -765,6 +765,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) int cpu = smp_processor_id(); int node = 0; unsigned bits; + unsigned apicid = phys_proc_id[cpu]; bits = 0; while ((1 << bits) < c->x86_num_cores) @@ -777,15 +778,19 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) #ifdef CONFIG_NUMA /* When an ACPI SRAT table is available use the mappings from SRAT - instead. */ - if (acpi_numa <= 0) { - node = phys_proc_id[cpu]; - if (!node_online(node)) - node = first_node(node_online_map); - cpu_to_node[cpu] = node; - } else { - node = cpu_to_node[cpu]; + instead. */ + node = phys_proc_id[cpu]; + if (acpi_numa > 0) { + if (apicid_to_node[apicid] != NUMA_NO_NODE) + node = apicid_to_node[apicid]; + else + printk(KERN_ERR + "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 printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n", diff --git a/arch/x86_64/mm/numa.c b/arch/x86_64/mm/numa.c index 04f7a33e144c..5b1518629893 100644 --- a/arch/x86_64/mm/numa.c +++ b/arch/x86_64/mm/numa.c @@ -29,6 +29,9 @@ int memnode_shift; u8 memnodemap[NODEMAPSIZE]; 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; int numa_off __initdata; diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c index 8e3d097a9ddd..92f6ec79b232 100644 --- a/arch/x86_64/mm/srat.c +++ b/arch/x86_64/mm/srat.c @@ -20,9 +20,6 @@ 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; @@ -104,18 +101,10 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) 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; - 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 */ diff --git a/include/asm-x86_64/numa.h b/include/asm-x86_64/numa.h index 5c363a1482e4..3aaf70027213 100644 --- a/include/asm-x86_64/numa.h +++ b/include/asm-x86_64/numa.h @@ -16,6 +16,8 @@ extern void numa_add_cpu(int cpu); extern void numa_init_array(void); extern int numa_off; +extern unsigned char apicid_to_node[256]; + #define NUMA_NO_NODE 0xff #endif |