aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/srat_64.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-01-23 08:37:39 -0500
committerIngo Molnar <mingo@elte.hu>2011-01-28 08:54:09 -0500
commitbbc9e2f452d9c4b166d1f9a78d941d80173312fe (patch)
treed75d41187b296235f833e942ed8c1dd938a7bae4 /arch/x86/mm/srat_64.c
parent89e5dc218e084e13a3996db6693b01478912f4ee (diff)
x86: Unify cpu/apicid <-> NUMA node mapping between 32 and 64bit
The mapping between cpu/apicid and node is done via apicid_to_node[] on 64bit and apicid_2_node[] + apic->x86_32_numa_cpu_node() on 32bit. This difference makes it difficult to further unify 32 and 64bit NUMA handling. This patch unifies it by replacing both apicid_to_node[] and apicid_2_node[] with __apicid_to_node[] array, which is accessed by two accessors - set_apicid_to_node() and numa_cpu_node(). On 64bit, numa_cpu_node() always consults __apicid_to_node[] directly while 32bit goes through apic->numa_cpu_node() method to allow apic implementations to override it. srat_detect_node() for amd cpus contains workaround for broken NUMA configuration which assumes relationship between APIC ID, HT node ID and NUMA topology. Leave it to access __apicid_to_node[] directly as mapping through CPU might result in undesirable behavior change. The comment is reformatted and updated to note the ugliness. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Pekka Enberg <penberg@kernel.org> Cc: eric.dumazet@gmail.com Cc: yinghai@kernel.org Cc: brgerst@gmail.com Cc: gorcunov@gmail.com Cc: shaohui.zheng@intel.com Cc: rientjes@google.com LKML-Reference: <1295789862-25482-14-git-send-email-tj@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: David Rientjes <rientjes@google.com>
Diffstat (limited to 'arch/x86/mm/srat_64.c')
-rw-r--r--arch/x86/mm/srat_64.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
index 603d285d1da..9a97261a241 100644
--- a/arch/x86/mm/srat_64.c
+++ b/arch/x86/mm/srat_64.c
@@ -79,7 +79,7 @@ static __init void bad_srat(void)
79 printk(KERN_ERR "SRAT: SRAT not used.\n"); 79 printk(KERN_ERR "SRAT: SRAT not used.\n");
80 acpi_numa = -1; 80 acpi_numa = -1;
81 for (i = 0; i < MAX_LOCAL_APIC; i++) 81 for (i = 0; i < MAX_LOCAL_APIC; i++)
82 apicid_to_node[i] = NUMA_NO_NODE; 82 set_apicid_to_node(i, NUMA_NO_NODE);
83 for (i = 0; i < MAX_NUMNODES; i++) { 83 for (i = 0; i < MAX_NUMNODES; i++) {
84 nodes[i].start = nodes[i].end = 0; 84 nodes[i].start = nodes[i].end = 0;
85 nodes_add[i].start = nodes_add[i].end = 0; 85 nodes_add[i].start = nodes_add[i].end = 0;
@@ -138,7 +138,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
138 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n", pxm, apic_id, node); 138 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n", pxm, apic_id, node);
139 return; 139 return;
140 } 140 }
141 apicid_to_node[apic_id] = node; 141 set_apicid_to_node(apic_id, node);
142 node_set(node, cpu_nodes_parsed); 142 node_set(node, cpu_nodes_parsed);
143 acpi_numa = 1; 143 acpi_numa = 1;
144 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n", 144 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u\n",
@@ -178,7 +178,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
178 return; 178 return;
179 } 179 }
180 180
181 apicid_to_node[apic_id] = node; 181 set_apicid_to_node(apic_id, node);
182 node_set(node, cpu_nodes_parsed); 182 node_set(node, cpu_nodes_parsed);
183 acpi_numa = 1; 183 acpi_numa = 1;
184 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%02x -> Node %u\n", 184 printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%02x -> Node %u\n",
@@ -521,7 +521,7 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
521 * node, it must now point to the fake node ID. 521 * node, it must now point to the fake node ID.
522 */ 522 */
523 for (j = 0; j < MAX_LOCAL_APIC; j++) 523 for (j = 0; j < MAX_LOCAL_APIC; j++)
524 if (apicid_to_node[j] == nid && 524 if (__apicid_to_node[j] == nid &&
525 fake_apicid_to_node[j] == NUMA_NO_NODE) 525 fake_apicid_to_node[j] == NUMA_NO_NODE)
526 fake_apicid_to_node[j] = i; 526 fake_apicid_to_node[j] = i;
527 } 527 }
@@ -532,13 +532,13 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
532 * value. 532 * value.
533 */ 533 */
534 for (i = 0; i < MAX_LOCAL_APIC; i++) 534 for (i = 0; i < MAX_LOCAL_APIC; i++)
535 if (apicid_to_node[i] != NUMA_NO_NODE && 535 if (__apicid_to_node[i] != NUMA_NO_NODE &&
536 fake_apicid_to_node[i] == NUMA_NO_NODE) 536 fake_apicid_to_node[i] == NUMA_NO_NODE)
537 fake_apicid_to_node[i] = 0; 537 fake_apicid_to_node[i] = 0;
538 538
539 for (i = 0; i < num_nodes; i++) 539 for (i = 0; i < num_nodes; i++)
540 __acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i); 540 __acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i);
541 memcpy(apicid_to_node, fake_apicid_to_node, sizeof(apicid_to_node)); 541 memcpy(__apicid_to_node, fake_apicid_to_node, sizeof(__apicid_to_node));
542 542
543 nodes_clear(nodes_parsed); 543 nodes_clear(nodes_parsed);
544 for (i = 0; i < num_nodes; i++) 544 for (i = 0; i < num_nodes; i++)