|
@@ -1153,6 +1153,8 @@ static cpumask_t cpu_associativity_changes_mask;
|
|
|
static int vphn_enabled;
|
|
|
static int prrn_enabled;
|
|
|
static void reset_topology_timer(void);
|
|
|
+static int topology_inited;
|
|
|
+static int topology_update_needed;
|
|
|
|
|
|
/*
|
|
|
* Store the current values of the associativity change counters in the
|
|
@@ -1246,6 +1248,10 @@ static long vphn_get_associativity(unsigned long cpu,
|
|
|
"hcall_vphn() experienced a hardware fault "
|
|
|
"preventing VPHN. Disabling polling...\n");
|
|
|
stop_topology_update();
|
|
|
+ break;
|
|
|
+ case H_SUCCESS:
|
|
|
+ dbg("VPHN hcall succeeded. Reset polling...\n");
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return rc;
|
|
@@ -1323,8 +1329,11 @@ int numa_update_cpu_topology(bool cpus_locked)
|
|
|
struct device *dev;
|
|
|
int weight, new_nid, i = 0;
|
|
|
|
|
|
- if (!prrn_enabled && !vphn_enabled)
|
|
|
+ if (!prrn_enabled && !vphn_enabled) {
|
|
|
+ if (!topology_inited)
|
|
|
+ topology_update_needed = 1;
|
|
|
return 0;
|
|
|
+ }
|
|
|
|
|
|
weight = cpumask_weight(&cpu_associativity_changes_mask);
|
|
|
if (!weight)
|
|
@@ -1363,6 +1372,8 @@ int numa_update_cpu_topology(bool cpus_locked)
|
|
|
cpumask_andnot(&cpu_associativity_changes_mask,
|
|
|
&cpu_associativity_changes_mask,
|
|
|
cpu_sibling_mask(cpu));
|
|
|
+ dbg("Assoc chg gives same node %d for cpu%d\n",
|
|
|
+ new_nid, cpu);
|
|
|
cpu = cpu_last_thread_sibling(cpu);
|
|
|
continue;
|
|
|
}
|
|
@@ -1433,6 +1444,7 @@ int numa_update_cpu_topology(bool cpus_locked)
|
|
|
|
|
|
out:
|
|
|
kfree(updates);
|
|
|
+ topology_update_needed = 0;
|
|
|
return changed;
|
|
|
}
|
|
|
|
|
@@ -1613,9 +1625,17 @@ static int topology_update_init(void)
|
|
|
if (topology_updates_enabled)
|
|
|
start_topology_update();
|
|
|
|
|
|
+ if (vphn_enabled)
|
|
|
+ topology_schedule_update();
|
|
|
+
|
|
|
if (!proc_create("powerpc/topology_updates", 0644, NULL, &topology_ops))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ topology_inited = 1;
|
|
|
+ if (topology_update_needed)
|
|
|
+ bitmap_fill(cpumask_bits(&cpu_associativity_changes_mask),
|
|
|
+ nr_cpumask_bits);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
device_initcall(topology_update_init);
|