|
@@ -340,17 +340,16 @@ static int __init nodes_cover_memory(const struct bootnode *nodes)
|
|
|
void __init acpi_numa_arch_fixup(void) {}
|
|
|
|
|
|
#ifdef CONFIG_NUMA_EMU
|
|
|
-int __init acpi_get_nodes(struct bootnode *physnodes)
|
|
|
+void __init acpi_get_nodes(struct bootnode *physnodes, unsigned long start,
|
|
|
+ unsigned long end)
|
|
|
{
|
|
|
int i;
|
|
|
- int ret = 0;
|
|
|
|
|
|
for_each_node_mask(i, nodes_parsed) {
|
|
|
- physnodes[ret].start = nodes[i].start;
|
|
|
- physnodes[ret].end = nodes[i].end;
|
|
|
- ret++;
|
|
|
+ cutoff_node(i, start, end);
|
|
|
+ physnodes[i].start = nodes[i].start;
|
|
|
+ physnodes[i].end = nodes[i].end;
|
|
|
}
|
|
|
- return ret;
|
|
|
}
|
|
|
#endif /* CONFIG_NUMA_EMU */
|
|
|
|
|
@@ -516,6 +515,17 @@ void __init acpi_fake_nodes(const struct bootnode *fake_nodes, int num_nodes)
|
|
|
fake_apicid_to_node[j] == NUMA_NO_NODE)
|
|
|
fake_apicid_to_node[j] = i;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If there are apicid-to-node mappings for physical nodes that do not
|
|
|
+ * have a corresponding emulated node, it should default to a guaranteed
|
|
|
+ * value.
|
|
|
+ */
|
|
|
+ for (i = 0; i < MAX_LOCAL_APIC; i++)
|
|
|
+ if (apicid_to_node[i] != NUMA_NO_NODE &&
|
|
|
+ fake_apicid_to_node[i] == NUMA_NO_NODE)
|
|
|
+ fake_apicid_to_node[i] = 0;
|
|
|
+
|
|
|
for (i = 0; i < num_nodes; i++)
|
|
|
__acpi_map_pxm_to_node(fake_node_to_pxm_map[i], i);
|
|
|
memcpy(apicid_to_node, fake_apicid_to_node, sizeof(apicid_to_node));
|