aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/mm
diff options
context:
space:
mode:
authorDavid Rientjes <rientjes@google.com>2007-07-21 11:10:33 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-21 21:37:10 -0400
commit08705b89ecb0f4b0ba5735630ef988bd9fd9dd95 (patch)
tree1b6b51c28cb852dcef4b343c5d8ac0afe276ed0b /arch/x86_64/mm
parent3484d79813707bb6045773953a809abba443dc20 (diff)
x86_64: fake apicid_to_node mapping for fake numa
When we are in the emulated NUMA case, we need to make sure that all existing apicid_to_node mappings that point to real node ID's now point to the equivalent fake node ID's. If we simply iterate over all apicid_to_node[] members for each node, we risk remapping an entry if it shares a node ID with a real node. Since apicid's may not be consecutive, we're forced to create an automatic array of apicid_to_node mappings and then copy it over once we have finished remapping fake to real nodes. Signed-off-by: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86_64/mm')
-rw-r--r--arch/x86_64/mm/srat.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c
index 7ac8ff333e84..acdf03e19146 100644
--- a/arch/x86_64/mm/srat.c
+++ b/arch/x86_64/mm/srat.c
@@ -470,10 +470,13 @@ static int __init find_node_by_addr(unsigned long addr)
470 */ 470 */
471void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes) 471void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
472{ 472{
473 int i; 473 int i, j;
474 int fake_node_to_pxm_map[MAX_NUMNODES] = { 474 int fake_node_to_pxm_map[MAX_NUMNODES] = {
475 [0 ... MAX_NUMNODES-1] = PXM_INVAL 475 [0 ... MAX_NUMNODES-1] = PXM_INVAL
476 }; 476 };
477 unsigned char fake_apicid_to_node[MAX_LOCAL_APIC] = {
478 [0 ... MAX_LOCAL_APIC-1] = NUMA_NO_NODE
479 };
477 480
478 printk(KERN_INFO "Faking PXM affinity for fake nodes on real " 481 printk(KERN_INFO "Faking PXM affinity for fake nodes on real "
479 "topology.\n"); 482 "topology.\n");
@@ -487,9 +490,17 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
487 if (pxm == PXM_INVAL) 490 if (pxm == PXM_INVAL)
488 continue; 491 continue;
489 fake_node_to_pxm_map[i] = pxm; 492 fake_node_to_pxm_map[i] = pxm;
493 /*
494 * For each apicid_to_node mapping that exists for this real
495 * node, it must now point to the fake node ID.
496 */
497 for (j = 0; j < MAX_LOCAL_APIC; j++)
498 if (apicid_to_node[j] == nid)
499 fake_apicid_to_node[j] = i;
490 } 500 }
491 for (i = 0; i < num_nodes; i++) 501 for (i = 0; i < num_nodes; i++)
492 __acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i); 502 __acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i);
503 memcpy(apicid_to_node, fake_apicid_to_node, sizeof(apicid_to_node));
493 504
494 nodes_clear(nodes_parsed); 505 nodes_clear(nodes_parsed);
495 for (i = 0; i < num_nodes; i++) 506 for (i = 0; i < num_nodes; i++)