diff options
-rw-r--r-- | arch/powerpc/include/asm/topology.h | 5 | ||||
-rw-r--r-- | arch/powerpc/kernel/smp.c | 5 | ||||
-rw-r--r-- | arch/powerpc/mm/numa.c | 20 |
3 files changed, 20 insertions, 10 deletions
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h index 16b077801a5f..a4a718dbfec6 100644 --- a/arch/powerpc/include/asm/topology.h +++ b/arch/powerpc/include/asm/topology.h | |||
@@ -92,6 +92,7 @@ extern int stop_topology_update(void); | |||
92 | extern int prrn_is_enabled(void); | 92 | extern int prrn_is_enabled(void); |
93 | extern int find_and_online_cpu_nid(int cpu); | 93 | extern int find_and_online_cpu_nid(int cpu); |
94 | extern int timed_topology_update(int nsecs); | 94 | extern int timed_topology_update(int nsecs); |
95 | extern void __init shared_proc_topology_init(void); | ||
95 | #else | 96 | #else |
96 | static inline int start_topology_update(void) | 97 | static inline int start_topology_update(void) |
97 | { | 98 | { |
@@ -113,6 +114,10 @@ static inline int timed_topology_update(int nsecs) | |||
113 | { | 114 | { |
114 | return 0; | 115 | return 0; |
115 | } | 116 | } |
117 | |||
118 | #ifdef CONFIG_SMP | ||
119 | static inline void shared_proc_topology_init(void) {} | ||
120 | #endif | ||
116 | #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ | 121 | #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ |
117 | 122 | ||
118 | #include <asm-generic/topology.h> | 123 | #include <asm-generic/topology.h> |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index b19d832ef386..61c1fadbc644 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -1160,6 +1160,11 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
1160 | if (smp_ops && smp_ops->bringup_done) | 1160 | if (smp_ops && smp_ops->bringup_done) |
1161 | smp_ops->bringup_done(); | 1161 | smp_ops->bringup_done(); |
1162 | 1162 | ||
1163 | /* | ||
1164 | * On a shared LPAR, associativity needs to be requested. | ||
1165 | * Hence, get numa topology before dumping cpu topology | ||
1166 | */ | ||
1167 | shared_proc_topology_init(); | ||
1163 | dump_numa_cpu_topology(); | 1168 | dump_numa_cpu_topology(); |
1164 | 1169 | ||
1165 | /* | 1170 | /* |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 0c7e05d89244..35ac5422903a 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -1078,7 +1078,6 @@ static int prrn_enabled; | |||
1078 | static void reset_topology_timer(void); | 1078 | static void reset_topology_timer(void); |
1079 | static int topology_timer_secs = 1; | 1079 | static int topology_timer_secs = 1; |
1080 | static int topology_inited; | 1080 | static int topology_inited; |
1081 | static int topology_update_needed; | ||
1082 | 1081 | ||
1083 | /* | 1082 | /* |
1084 | * Change polling interval for associativity changes. | 1083 | * Change polling interval for associativity changes. |
@@ -1306,11 +1305,8 @@ int numa_update_cpu_topology(bool cpus_locked) | |||
1306 | struct device *dev; | 1305 | struct device *dev; |
1307 | int weight, new_nid, i = 0; | 1306 | int weight, new_nid, i = 0; |
1308 | 1307 | ||
1309 | if (!prrn_enabled && !vphn_enabled) { | 1308 | if (!prrn_enabled && !vphn_enabled && topology_inited) |
1310 | if (!topology_inited) | ||
1311 | topology_update_needed = 1; | ||
1312 | return 0; | 1309 | return 0; |
1313 | } | ||
1314 | 1310 | ||
1315 | weight = cpumask_weight(&cpu_associativity_changes_mask); | 1311 | weight = cpumask_weight(&cpu_associativity_changes_mask); |
1316 | if (!weight) | 1312 | if (!weight) |
@@ -1423,7 +1419,6 @@ int numa_update_cpu_topology(bool cpus_locked) | |||
1423 | 1419 | ||
1424 | out: | 1420 | out: |
1425 | kfree(updates); | 1421 | kfree(updates); |
1426 | topology_update_needed = 0; | ||
1427 | return changed; | 1422 | return changed; |
1428 | } | 1423 | } |
1429 | 1424 | ||
@@ -1551,6 +1546,15 @@ int prrn_is_enabled(void) | |||
1551 | return prrn_enabled; | 1546 | return prrn_enabled; |
1552 | } | 1547 | } |
1553 | 1548 | ||
1549 | void __init shared_proc_topology_init(void) | ||
1550 | { | ||
1551 | if (lppaca_shared_proc(get_lppaca())) { | ||
1552 | bitmap_fill(cpumask_bits(&cpu_associativity_changes_mask), | ||
1553 | nr_cpumask_bits); | ||
1554 | numa_update_cpu_topology(false); | ||
1555 | } | ||
1556 | } | ||
1557 | |||
1554 | static int topology_read(struct seq_file *file, void *v) | 1558 | static int topology_read(struct seq_file *file, void *v) |
1555 | { | 1559 | { |
1556 | if (vphn_enabled || prrn_enabled) | 1560 | if (vphn_enabled || prrn_enabled) |
@@ -1608,10 +1612,6 @@ static int topology_update_init(void) | |||
1608 | return -ENOMEM; | 1612 | return -ENOMEM; |
1609 | 1613 | ||
1610 | topology_inited = 1; | 1614 | topology_inited = 1; |
1611 | if (topology_update_needed) | ||
1612 | bitmap_fill(cpumask_bits(&cpu_associativity_changes_mask), | ||
1613 | nr_cpumask_bits); | ||
1614 | |||
1615 | return 0; | 1615 | return 0; |
1616 | } | 1616 | } |
1617 | device_initcall(topology_update_init); | 1617 | device_initcall(topology_update_init); |