aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Anaczkowski <lukasz.anaczkowski@intel.com>2016-04-21 05:29:00 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-04-21 16:13:03 -0400
commit702b07fcc9b264c9afd372676bbdd50a762dcde0 (patch)
treea92c009c3afe4b213ccb0da65cdd231dfcd7aff2
parentc3b46c73264b03000d1e18b22f5caf63332547c9 (diff)
ACPI / SRAT: fix SRAT parsing order with both LAPIC and X2APIC present
SRAT maps APIC ID to proximity domains ids (PXM). Mapping from PXM to NUMA node ids is based on order of entries in SRAT table. SRAT table has just LAPIC entires or mix of LAPIC and X2APIC entries. As long as there are only LAPIC entires, mapping from proximity domain id to NUMA node id is as assumed by BIOS. However, once APIC entries are mixed, X2APIC entries would be first mapped which causes unexpected NUMA node mapping. To fix that, change parsing to check each entry against both LAPIC and X2APIC so mapping is in the SRAT/PXM order. This is supplemental change to the fix made by commit d81056b5278 (Handle apic/x2apic entries in MADT in correct order) and using the mechanism introduced by 9b3fedd (ACPI / tables: Add acpi_subtable_proc to ACPI table parsers). Fixes: d81056b5278 (Handle apic/x2apic entries in MADT in correct order) Signed-off-by: Lukasz Anaczkowski <lukasz.anaczkowski@intel.com> [ rjw : Subject & changelog ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/numa.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 72b6e9ef0ae9..d176e0ece470 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -327,10 +327,18 @@ int __init acpi_numa_init(void)
327 327
328 /* SRAT: Static Resource Affinity Table */ 328 /* SRAT: Static Resource Affinity Table */
329 if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) { 329 if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
330 acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY, 330 struct acpi_subtable_proc srat_proc[2];
331 acpi_parse_x2apic_affinity, 0); 331
332 acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY, 332 memset(srat_proc, 0, sizeof(srat_proc));
333 acpi_parse_processor_affinity, 0); 333 srat_proc[0].id = ACPI_SRAT_TYPE_CPU_AFFINITY;
334 srat_proc[0].handler = acpi_parse_processor_affinity;
335 srat_proc[1].id = ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY;
336 srat_proc[1].handler = acpi_parse_x2apic_affinity;
337
338 acpi_table_parse_entries_array(ACPI_SIG_SRAT,
339 sizeof(struct acpi_table_srat),
340 srat_proc, ARRAY_SIZE(srat_proc), 0);
341
334 cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY, 342 cnt = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
335 acpi_parse_memory_affinity, 343 acpi_parse_memory_affinity,
336 NR_NODE_MEMBLKS); 344 NR_NODE_MEMBLKS);