|
@@ -486,7 +486,7 @@ static int numa_setup_cpu(unsigned long lcpu)
|
|
|
nid = of_node_to_nid_single(cpu);
|
|
|
|
|
|
out_present:
|
|
|
- if (nid < 0 || !node_online(nid))
|
|
|
+ if (nid < 0 || !node_possible(nid))
|
|
|
nid = first_online_node;
|
|
|
|
|
|
map_cpu_to_node(lcpu, nid);
|
|
@@ -828,10 +828,8 @@ static void __init find_possible_nodes(void)
|
|
|
goto out;
|
|
|
|
|
|
for (i = 0; i < numnodes; i++) {
|
|
|
- if (!node_possible(i)) {
|
|
|
- setup_node_data(i, 0, 0);
|
|
|
+ if (!node_possible(i))
|
|
|
node_set(i, node_possible_map);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
out:
|
|
@@ -1200,6 +1198,40 @@ static long vphn_get_associativity(unsigned long cpu,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static inline int find_and_online_cpu_nid(int cpu)
|
|
|
+{
|
|
|
+ __be32 associativity[VPHN_ASSOC_BUFSIZE] = {0};
|
|
|
+ int new_nid;
|
|
|
+
|
|
|
+ /* Use associativity from first thread for all siblings */
|
|
|
+ vphn_get_associativity(cpu, associativity);
|
|
|
+ new_nid = associativity_to_nid(associativity);
|
|
|
+ if (new_nid < 0 || !node_possible(new_nid))
|
|
|
+ new_nid = first_online_node;
|
|
|
+
|
|
|
+ if (NODE_DATA(new_nid) == NULL) {
|
|
|
+#ifdef CONFIG_MEMORY_HOTPLUG
|
|
|
+ /*
|
|
|
+ * Need to ensure that NODE_DATA is initialized for a node from
|
|
|
+ * available memory (see memblock_alloc_try_nid). If unable to
|
|
|
+ * init the node, then default to nearest node that has memory
|
|
|
+ * installed.
|
|
|
+ */
|
|
|
+ if (try_online_node(new_nid))
|
|
|
+ new_nid = first_online_node;
|
|
|
+#else
|
|
|
+ /*
|
|
|
+ * Default to using the nearest node that has memory installed.
|
|
|
+ * Otherwise, it would be necessary to patch the kernel MM code
|
|
|
+ * to deal with more memoryless-node error conditions.
|
|
|
+ */
|
|
|
+ new_nid = first_online_node;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+
|
|
|
+ return new_nid;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Update the CPU maps and sysfs entries for a single CPU when its NUMA
|
|
|
* characteristics change. This function doesn't perform any locking and is
|
|
@@ -1267,7 +1299,6 @@ int numa_update_cpu_topology(bool cpus_locked)
|
|
|
{
|
|
|
unsigned int cpu, sibling, changed = 0;
|
|
|
struct topology_update_data *updates, *ud;
|
|
|
- __be32 associativity[VPHN_ASSOC_BUFSIZE] = {0};
|
|
|
cpumask_t updated_cpus;
|
|
|
struct device *dev;
|
|
|
int weight, new_nid, i = 0;
|
|
@@ -1305,11 +1336,7 @@ int numa_update_cpu_topology(bool cpus_locked)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* Use associativity from first thread for all siblings */
|
|
|
- vphn_get_associativity(cpu, associativity);
|
|
|
- new_nid = associativity_to_nid(associativity);
|
|
|
- if (new_nid < 0 || !node_online(new_nid))
|
|
|
- new_nid = first_online_node;
|
|
|
+ new_nid = find_and_online_cpu_nid(cpu);
|
|
|
|
|
|
if (new_nid == numa_cpu_lookup_table[cpu]) {
|
|
|
cpumask_andnot(&cpu_associativity_changes_mask,
|