Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -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",
+3 −0
Original line number Diff line number Diff line
@@ -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;
+3 −14
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -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