Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cee5405d authored by Michael Bringmann's avatar Michael Bringmann Committed by Michael Ellerman
Browse files

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: default avatarMichael Bringmann <mwb@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent a3496e91
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -96,6 +96,14 @@ static inline int prrn_is_enabled(void)
}
#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>

#ifdef CONFIG_SMP
+22 −1
Original line number Diff line number Diff line
@@ -1148,14 +1148,34 @@ 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);
}

+2 −0
Original line number Diff line number Diff line
@@ -363,6 +363,7 @@ static int dlpar_online_cpu(struct device_node *dn)
			BUG_ON(get_cpu_current_state(cpu)
					!= CPU_STATE_OFFLINE);
			cpu_maps_update_done();
			timed_topology_update(1);
			rc = device_online(get_cpu_device(cpu));
			if (rc)
				goto out;
@@ -533,6 +534,7 @@ static int dlpar_offline_cpu(struct device_node *dn)
				set_preferred_offline_state(cpu,
							    CPU_STATE_OFFLINE);
				cpu_maps_update_done();
				timed_topology_update(1);
				rc = device_offline(get_cpu_device(cpu));
				if (rc)
					goto out;