[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>
This commit is contained in:
Andi Kleen 2005-09-12 18:49:24 +02:00 committed by Linus Torvalds
parent f1f4e83fd9
commit 0b07e984fc
4 changed files with 21 additions and 22 deletions

View File

@ -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)
@ -778,14 +779,18 @@ 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 (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;
} else {
node = cpu_to_node[cpu];
}
#endif
printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n",

View File

@ -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;

View File

@ -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 */

View File

@ -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