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>
This commit is contained in:
parent
a3496e9137
commit
cee5405da4
|
@ -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 {
|
||||||
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,
|
||||||
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 =
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue