summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/topology.h5
-rw-r--r--arch/powerpc/kernel/smp.c5
-rw-r--r--arch/powerpc/mm/numa.c20
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);
92extern int prrn_is_enabled(void); 92extern int prrn_is_enabled(void);
93extern int find_and_online_cpu_nid(int cpu); 93extern int find_and_online_cpu_nid(int cpu);
94extern int timed_topology_update(int nsecs); 94extern int timed_topology_update(int nsecs);
95extern void __init shared_proc_topology_init(void);
95#else 96#else
96static inline int start_topology_update(void) 97static 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
119static 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;
1078static void reset_topology_timer(void); 1078static void reset_topology_timer(void);
1079static int topology_timer_secs = 1; 1079static int topology_timer_secs = 1;
1080static int topology_inited; 1080static int topology_inited;
1081static 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
1424out: 1420out:
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
1549void __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
1554static int topology_read(struct seq_file *file, void *v) 1558static 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}
1617device_initcall(topology_update_init); 1617device_initcall(topology_update_init);