summaryrefslogtreecommitdiff
path: root/arch/powerpc/mm
diff options
context:
space:
mode:
authorMichael Bringmann <mwb@linux.vnet.ibm.com>2017-09-08 15:47:47 -0500
committerMichael Ellerman <mpe@ellerman.id.au>2017-10-16 23:12:04 +1100
commitcee5405da4020b0b0233bc8fb7c8da7322d2c52e (patch)
tree7aa1ab90fe1ab627a6dcd01d7114bbd387a0094e /arch/powerpc/mm
parenta3496e9137f6f58439da29a761725e083229c4a8 (diff)
powerpc/hotplug: Improve responsiveness of hotplug change
powerpc/hotplug: On Power systems with shared configurations of CPUs and memory, there are some issues with the association of additional CPUs and memory to nodes when hot-adding resources. During hotplug CPU operations, this patch resets the timer on topology update work function to a small value to better ensure that the CPU topology is detected and configured sooner. Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/mm')
-rw-r--r--arch/powerpc/mm/numa.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 5f5ff46ae76d..32f5f8db46ec 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -1148,15 +1148,35 @@ struct topology_update_data {
int new_nid;
};
+#define TOPOLOGY_DEF_TIMER_SECS 60
+
static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
static cpumask_t cpu_associativity_changes_mask;
static int vphn_enabled;
static int prrn_enabled;
static void reset_topology_timer(void);
+static int topology_timer_secs = 1;
static int topology_inited;
static int topology_update_needed;
/*
+ * Change polling interval for associativity changes.
+ */
+int timed_topology_update(int nsecs)
+{
+ if (vphn_enabled) {
+ if (nsecs > 0)
+ topology_timer_secs = nsecs;
+ else
+ topology_timer_secs = TOPOLOGY_DEF_TIMER_SECS;
+
+ reset_topology_timer();
+ }
+
+ return 0;
+}
+
+/*
* Store the current values of the associativity change counters in the
* hypervisor.
*/
@@ -1251,6 +1271,7 @@ static long vphn_get_associativity(unsigned long cpu,
break;
case H_SUCCESS:
dbg("VPHN hcall succeeded. Reset polling...\n");
+ timed_topology_update(0);
break;
}
@@ -1481,7 +1502,7 @@ static struct timer_list topology_timer =
static void reset_topology_timer(void)
{
topology_timer.data = 0;
- topology_timer.expires = jiffies + 60 * HZ;
+ topology_timer.expires = jiffies + topology_timer_secs * HZ;
mod_timer(&topology_timer, topology_timer.expires);
}