提交 cee5405d 编写于 作者: M Michael Bringmann 提交者: Michael Ellerman

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: NMichael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
上级 a3496e91
...@@ -96,6 +96,14 @@ static inline int prrn_is_enabled(void) ...@@ -96,6 +96,14 @@ static inline int prrn_is_enabled(void)
} }
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ #endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_NEED_MULTIPLE_NODES)
#if defined(CONFIG_PPC_SPLPAR)
extern int timed_topology_update(int nsecs);
#else
#define timed_topology_update(nsecs)
#endif /* CONFIG_PPC_SPLPAR */
#endif /* CONFIG_HOTPLUG_CPU || CONFIG_NEED_MULTIPLE_NODES */
#include <asm-generic/topology.h> #include <asm-generic/topology.h>
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -1148,14 +1148,34 @@ struct topology_update_data { ...@@ -1148,14 +1148,34 @@ struct topology_update_data {
int new_nid; int new_nid;
}; };
#define TOPOLOGY_DEF_TIMER_SECS 60
static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS]; static u8 vphn_cpu_change_counts[NR_CPUS][MAX_DISTANCE_REF_POINTS];
static cpumask_t cpu_associativity_changes_mask; static cpumask_t cpu_associativity_changes_mask;
static int vphn_enabled; static int vphn_enabled;
static int prrn_enabled; static int prrn_enabled;
static void reset_topology_timer(void); static void reset_topology_timer(void);
static int topology_timer_secs = 1;
static int topology_inited; static int topology_inited;
static int topology_update_needed; 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 * Store the current values of the associativity change counters in the
* hypervisor. * hypervisor.
...@@ -1251,6 +1271,7 @@ static long vphn_get_associativity(unsigned long cpu, ...@@ -1251,6 +1271,7 @@ static long vphn_get_associativity(unsigned long cpu,
break; break;
case H_SUCCESS: case H_SUCCESS:
dbg("VPHN hcall succeeded. Reset polling...\n"); dbg("VPHN hcall succeeded. Reset polling...\n");
timed_topology_update(0);
break; break;
} }
...@@ -1481,7 +1502,7 @@ static struct timer_list topology_timer = ...@@ -1481,7 +1502,7 @@ static struct timer_list topology_timer =
static void reset_topology_timer(void) static void reset_topology_timer(void)
{ {
topology_timer.data = 0; 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); mod_timer(&topology_timer, topology_timer.expires);
} }
......
...@@ -363,6 +363,7 @@ static int dlpar_online_cpu(struct device_node *dn) ...@@ -363,6 +363,7 @@ static int dlpar_online_cpu(struct device_node *dn)
BUG_ON(get_cpu_current_state(cpu) BUG_ON(get_cpu_current_state(cpu)
!= CPU_STATE_OFFLINE); != CPU_STATE_OFFLINE);
cpu_maps_update_done(); cpu_maps_update_done();
timed_topology_update(1);
rc = device_online(get_cpu_device(cpu)); rc = device_online(get_cpu_device(cpu));
if (rc) if (rc)
goto out; goto out;
...@@ -533,6 +534,7 @@ static int dlpar_offline_cpu(struct device_node *dn) ...@@ -533,6 +534,7 @@ static int dlpar_offline_cpu(struct device_node *dn)
set_preferred_offline_state(cpu, set_preferred_offline_state(cpu,
CPU_STATE_OFFLINE); CPU_STATE_OFFLINE);
cpu_maps_update_done(); cpu_maps_update_done();
timed_topology_update(1);
rc = device_offline(get_cpu_device(cpu)); rc = device_offline(get_cpu_device(cpu));
if (rc) if (rc)
goto out; goto out;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册