Skip to content

Commit

Permalink
[PATCH] x86-64: Don't assign CPU numbers in SRAT parsing
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andi Kleen authored and Linus Torvalds committed Sep 12, 2005
1 parent f1f4e83 commit 0b07e98
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 22 deletions.
21 changes: 13 additions & 8 deletions arch/x86_64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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",
Expand Down
3 changes: 3 additions & 0 deletions arch/x86_64/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
17 changes: 3 additions & 14 deletions arch/x86_64/mm/srat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down
2 changes: 2 additions & 0 deletions include/asm-x86_64/numa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 0b07e98

Please sign in to comment.