linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [RFC 0/3] powerpc/pseries: Remap hw to kernel cpu indexes
@ 2018-12-11 22:03 Michael Bringmann
  2018-12-11 22:03 ` [RFC 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Michael Bringmann @ 2018-12-11 22:03 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel, linuxppc-dev
  Cc: Rob Herring, Mike Rapoport, tlfalcon, Srikar Dronamraju,
	Nicholas Piggin, Vaidyanathan Srinivasan, mwb, minkim,
	Paul Mackerras, tyreld, Andrew Morton, Guenter Roeck

Define and apply new interface to map hardware-specific powerpc cpu
ids to a kernel specific range of cpu values.  Mapping is intended
to prevent confusion within the kernel about the cpu+node mapping,
and the changes in configuration that may happen due to powerpc LPAR
migration or other associativity changes during the lifetime of a
system.  These interfaces exchange the thread_index provided by the
'ibm,ppc-interrupt-server#s' properties, for an internal index to
be used by kernel scheduling interfaces.

Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>

Michael Bringmann (3):
  powerpc/numa: Conditionally online new nodes
  powerpc/numa: Define mapping between HW and kernel cpus
  powerpc/numa: Apply mapping between HW and kernel cpu


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [RFC 1/3] powerpc/numa: Conditionally online new nodes
  2018-12-11 22:03 [RFC 0/3] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
@ 2018-12-11 22:03 ` Michael Bringmann
  2018-12-11 22:03 ` [RFC 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
  2018-12-11 22:04 ` [RFC 3/3] powerpc/numa: Apply " Michael Bringmann
  2 siblings, 0 replies; 4+ messages in thread
From: Michael Bringmann @ 2018-12-11 22:03 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel, linuxppc-dev
  Cc: Rob Herring, Mike Rapoport, tlfalcon, Srikar Dronamraju,
	Nicholas Piggin, Vaidyanathan Srinivasan, mwb, minkim,
	Paul Mackerras, tyreld, Andrew Morton, Guenter Roeck,
	Corentin Labbe

Add argument to allow caller to determine whether the node identified
for a cpu after an associativity / affinity change should be inited.

Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/topology.h          |    2 +-
 arch/powerpc/mm/numa.c                       |    6 +++---
 arch/powerpc/platforms/pseries/hotplug-cpu.c |    2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index a4a718d..4621f40 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -90,7 +90,7 @@ static inline void update_numa_cpu_lookup_table(unsigned int cpu, int node) {}
 extern int start_topology_update(void);
 extern int stop_topology_update(void);
 extern int prrn_is_enabled(void);
-extern int find_and_online_cpu_nid(int cpu);
+extern int find_and_online_cpu_nid(int cpu, bool must_online);
 extern int timed_topology_update(int nsecs);
 extern void __init shared_proc_topology_init(void);
 #else
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 87f0dd0..7d6bba264 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -1197,7 +1197,7 @@ static long vphn_get_associativity(unsigned long cpu,
 	return rc;
 }
 
-int find_and_online_cpu_nid(int cpu)
+int find_and_online_cpu_nid(int cpu, bool must_online)
 {
 	__be32 associativity[VPHN_ASSOC_BUFSIZE] = {0};
 	int new_nid;
@@ -1210,7 +1210,7 @@ int find_and_online_cpu_nid(int cpu)
 	if (new_nid < 0 || !node_possible(new_nid))
 		new_nid = first_online_node;
 
-	if (NODE_DATA(new_nid) == NULL) {
+	if (must_online && (NODE_DATA(new_nid) == NULL)) {
 #ifdef CONFIG_MEMORY_HOTPLUG
 		/*
 		 * Need to ensure that NODE_DATA is initialized for a node from
@@ -1337,7 +1337,7 @@ int numa_update_cpu_topology(bool cpus_locked)
 			continue;
 		}
 
-		new_nid = find_and_online_cpu_nid(cpu);
+		new_nid = find_and_online_cpu_nid(cpu, true);
 
 		if (new_nid == numa_cpu_lookup_table[cpu]) {
 			cpumask_andnot(&cpu_associativity_changes_mask,
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 2f8e621..620cb57 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -366,7 +366,7 @@ static int dlpar_online_cpu(struct device_node *dn)
 					!= CPU_STATE_OFFLINE);
 			cpu_maps_update_done();
 			timed_topology_update(1);
-			find_and_online_cpu_nid(cpu);
+			find_and_online_cpu_nid(cpu, true);
 			rc = device_online(get_cpu_device(cpu));
 			if (rc)
 				goto out;


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC 2/3] powerpc/numa: Define mapping between HW and kernel cpus
  2018-12-11 22:03 [RFC 0/3] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  2018-12-11 22:03 ` [RFC 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
@ 2018-12-11 22:03 ` Michael Bringmann
  2018-12-11 22:04 ` [RFC 3/3] powerpc/numa: Apply " Michael Bringmann
  2 siblings, 0 replies; 4+ messages in thread
From: Michael Bringmann @ 2018-12-11 22:03 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel, linuxppc-dev
  Cc: Rodrigo R. Galvao, tlfalcon, Srikar Dronamraju,
	Bartlomiej Zolnierkiewicz, Mauro S. M. Rodrigues,
	Vaidyanathan Srinivasan, mwb, minkim, Paul Mackerras, tyreld,
	Oliver O'Halloran, Dan Williams, Guenter Roeck,
	Corentin Labbe

Define interface to map external powerpc cpus across multiple nodes
to a range of kernel cpu values.  Mapping is intended to prevent
confusion within the kernel about the cpu+node mapping, and the
changes in configuration that may happen due to powerpc LPAR
migration or other associativity changes during the lifetime of a
system.  These interfaces will be used entirely within the powerpc
kernel code to maintain separation between the machine and kernel
contexts.

Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/topology.h       |   31 +++++++
 arch/powerpc/platforms/pseries/Kconfig    |   10 ++
 arch/powerpc/platforms/pseries/Makefile   |    1 
 arch/powerpc/platforms/pseries/cpuremap.c |  131 +++++++++++++++++++++++++++++
 4 files changed, 173 insertions(+)
 create mode 100644 arch/powerpc/platforms/pseries/cpuremap.c

diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index 4621f40..db11969 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -135,5 +135,36 @@ static inline void shared_proc_topology_init(void) {}
 #endif
 #endif
 
+#define CPUREMAP_NO_CPU		(~0)
+#define CPUREMAP_NO_THREAD	(~0)
+
+#ifdef CONFIG_CPUREMAP
+extern int cpuremap_thread_to_cpu(int thread_index);
+		/* Return CPUREMAP_NO_CPU if not found */
+extern int cpuremap_map_cpu(int thread_index, int in_core_ndx, int node);
+		/* Return CPUREMAP_NO_CPU if fails */
+extern int cpuremap_reserve_cpu(int cpu);
+		/* Return CPUREMAP_NO_CPU if fails */
+extern int cpuremap_release_cpu(int cpu);
+		/* Return CPUREMAP_NO_CPU if fails */
+extern int cpuremap_cpu_to_thread(int cpu);
+		/* Return CPUREMAP_NO_THREAD if not found */
+extern void cpuremap_init(void);
+		/* Identify necessary constants & alloc memory at boot */
+#else
+static inline int cpuremap_thread_to_cpu(int thread_index)
+{
+	return thread_index;
+}
+static inline int cpuremap_map_cpu(int thread_index, int in_core_ndx, int node)
+{
+	return thread_index;
+}
+static inline int cpuremap_reserve_cpu(int cpu) { return cpu; }
+static inline int cpuremap_release_cpu(int cpu) { return cpu; }
+static inline int cpuremap_cpu_to_thread(int cpu) { return cpu; }
+static inline void cpuremap_init(void) {}
+#endif
+
 #endif /* __KERNEL__ */
 #endif	/* _ASM_POWERPC_TOPOLOGY_H */
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
index 2e4bd32..c35009f 100644
--- a/arch/powerpc/platforms/pseries/Kconfig
+++ b/arch/powerpc/platforms/pseries/Kconfig
@@ -145,3 +145,13 @@ config PAPR_SCM
 	tristate "Support for the PAPR Storage Class Memory interface"
 	help
 	  Enable access to hypervisor provided storage class memory.
+          Enable access to hypervisor provided storage class memory.
+
+config CPUREMAP
+        bool "Support for mapping hw cpu+node to kernel index"
+        depends on SMP && (PPC_PSERIES)
+        ---help---
+          Say Y here to be able to remap hw cpu+node to standardized
+          kernel CPUs at runtime on Pseries machines.
+
+          Say N if you are unsure.
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index a43ec84..ad49d8e 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_KEXEC_CORE)	+= kexec.o
 obj-$(CONFIG_PSERIES_ENERGY)	+= pseries_energy.o
 
 obj-$(CONFIG_HOTPLUG_CPU)	+= hotplug-cpu.o
+obj-$(CONFIG_CPUREMAP)		+= cpuremap.o
 obj-$(CONFIG_MEMORY_HOTPLUG)	+= hotplug-memory.o pmem.o
 
 obj-$(CONFIG_HVC_CONSOLE)	+= hvconsole.o
diff --git a/arch/powerpc/platforms/pseries/cpuremap.c b/arch/powerpc/platforms/pseries/cpuremap.c
new file mode 100644
index 0000000..86fdf12
--- /dev/null
+++ b/arch/powerpc/platforms/pseries/cpuremap.c
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/string.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <asm/prom.h>
+#include <asm/topology.h>
+
+struct cpuremap_cpu {
+	int thread_index;
+		/* Set to thread_index from ibm,ppc-interrupt-server#s arrays
+		 * Don't clear when release'ed
+		 */
+	int node;
+	bool in_use;
+		/* Set to true when reserve'ed
+		 * Don't clear when release'ed
+		*/
+};
+
+struct cpuremap_struct {
+	int num_nodes;
+	int num_cores;
+	int num_threads_per_core;
+	struct cpuremap_cpu *threads;
+} cpuremap_data;
+
+
+void cpuremap_init(void)
+{
+	int i, k;
+
+	/* Identify necessary constants & alloc memory at boot */
+	cpuremap_data.num_threads_per_core = 8;
+	cpuremap_data.num_cores = 32;
+	cpuremap_data.num_nodes =
+		nr_cpu_ids /
+		(cpuremap_data.num_threads_per_core * cpuremap_data.num_cores);
+	cpuremap_data.threads = kcalloc(nr_cpu_ids, sizeof(struct cpuremap_cpu), GFP_KERNEL);
+
+	k = cpuremap_data.num_nodes *
+		cpuremap_data.num_threads_per_core *
+		cpuremap_data.num_cores;
+	for (i = 0; i < k; k++)
+		cpuremap_data.threads[i].thread_index = CPUREMAP_NO_THREAD;
+}
+
+int cpuremap_thread_to_cpu(int thread_index)
+{
+	int i, k;
+
+	/* Return NO_CPU if not found */
+	for (i = thread_index, k = 0; k < nr_cpu_ids; k++) {
+		if (cpuremap_data.threads[i].in_use &&
+		    (cpuremap_data.threads[i].thread_index == thread_index)) {
+			cpuremap_data.threads[i].in_use = true;
+			cpuremap_data.threads[i].thread_index = thread_index;
+			return i;
+		}
+		if (i >= nr_cpu_ids)
+			i = 0;
+	}
+	return CPUREMAP_NO_CPU;
+}
+
+int cpuremap_cpu_to_thread(int cpu)
+{
+	/* Return NO_THREAD if not found */
+	if (cpuremap_data.threads[cpu].in_use)
+		return cpuremap_data.threads[cpu].thread_index;
+	return CPUREMAP_NO_THREAD;
+}
+
+int cpuremap_map_cpu(int thread_index, int in_core_ndx, int node)
+{
+	int first_thread, i, k;
+
+	/* Return NO_CPU if fails */
+	first_thread = (node *
+		(cpuremap_data.num_threads_per_core *
+		 cpuremap_data.num_cores)) + in_core_ndx;
+
+	/* Alternative 0: Compressed map of cpus+nodes+threads
+	 *   assuming that no system will be fully built out.
+	 * Alternative 1: Fully compact.  Allocate new cpu ids
+	 *   as needed.  No 'pretty' separation between nodes.
+	 * Alternative 2: Also map incoming nodes from pHyp
+	 *   to virtual nodes for purposes of new cpu ids.
+	 */
+
+	if (first_thread > nr_cpu_ids)
+		first_thread = 0 + in_core_ndx;
+	for (i = first_thread, k = 0; k < nr_cpu_ids; k++) {
+		if (!cpuremap_data.threads[i].in_use || (cpuremap_data.threads[i].thread_index == thread_index)) {
+			cpuremap_data.threads[i].thread_index = thread_index;
+			cpuremap_data.threads[i].node = node;
+			return i;
+		}
+		if (i >= nr_cpu_ids)
+			i = 0;
+	}
+	return CPUREMAP_NO_CPU;
+}
+
+int cpuremap_reserve_cpu(int cpu)
+{
+	if (!cpuremap_data.threads[cpu].in_use) {
+		cpuremap_data.threads[cpu].in_use = true;
+		return cpu;
+	}
+	return CPUREMAP_NO_CPU;
+}
+
+int cpuremap_release_cpu(int cpu)
+{
+	if (cpuremap_data.threads[cpu].in_use) {
+		cpuremap_data.threads[cpu].in_use = false;
+		return cpu;
+	}
+	return CPUREMAP_NO_CPU;
+}
+
+int cpuremap_free_cpu(int cpu)
+{
+	/* Return NO_CPU if fails */
+	if (cpuremap_data.threads[cpu].in_use) {
+		cpuremap_data.threads[cpu].in_use = false;
+		return cpu;
+	}
+	return CPUREMAP_NO_CPU;
+}


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC 3/3] powerpc/numa: Apply mapping between HW and kernel cpus
  2018-12-11 22:03 [RFC 0/3] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  2018-12-11 22:03 ` [RFC 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
  2018-12-11 22:03 ` [RFC 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
@ 2018-12-11 22:04 ` Michael Bringmann
  2 siblings, 0 replies; 4+ messages in thread
From: Michael Bringmann @ 2018-12-11 22:04 UTC (permalink / raw)
  To: linuxppc-dev, linux-kernel, linuxppc-dev
  Cc: Rob Herring, Mike Rapoport, tlfalcon, Srikar Dronamraju,
	Nicholas Piggin, Vaidyanathan Srinivasan, mwb, minkim,
	Paul Mackerras, tyreld, Andrew Morton, Guenter Roeck

Apply new interface to map external powerpc cpus across multiple
nodes to a range of kernel cpu values.  Mapping is intended to
prevent confusion within the kernel about the cpu+node mapping, and
the changes in configuration that may happen due to powerpc LPAR
migration or other associativity changes during the lifetime of a
system.  These interfaces exchange the thread_index provided by the
'ibm,ppc-interrupt-server#s' properties, for an internal index to
be used by kernel scheduling interfaces.

Signed-off-by: Michael Bringmann <mwb@linux.vnet.ibm.com>
---
 arch/powerpc/mm/numa.c                       |   45 +++++++++++++++++---------
 arch/powerpc/platforms/pseries/hotplug-cpu.c |   15 +++++++--
 2 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 7d6bba264..59d7cd9 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -1063,7 +1063,8 @@ u64 memory_hotplug_max(void)
 
 struct topology_update_data {
 	struct topology_update_data *next;
-	unsigned int cpu;
+	unsigned int old_cpu;
+	unsigned int new_cpu;
 	int old_nid;
 	int new_nid;
 };
@@ -1253,13 +1254,13 @@ static int update_cpu_topology(void *data)
 
 	for (update = data; update; update = update->next) {
 		int new_nid = update->new_nid;
-		if (cpu != update->cpu)
+		if (cpu != update->new_cpu)
 			continue;
 
-		unmap_cpu_from_node(cpu);
-		map_cpu_to_node(cpu, new_nid);
-		set_cpu_numa_node(cpu, new_nid);
-		set_cpu_numa_mem(cpu, local_memory_node(new_nid));
+		unmap_cpu_from_node(update->old_cpu);
+		map_cpu_to_node(update->new_cpu, new_nid);
+		set_cpu_numa_node(update->new_cpu, new_nid);
+		set_cpu_numa_mem(update->new_cpu, local_memory_node(new_nid));
 		vdso_getcpu_init();
 	}
 
@@ -1283,7 +1284,7 @@ static int update_lookup_table(void *data)
 		int nid, base, j;
 
 		nid = update->new_nid;
-		base = cpu_first_thread_sibling(update->cpu);
+		base = cpu_first_thread_sibling(update->new_cpu);
 
 		for (j = 0; j < threads_per_core; j++) {
 			update_numa_cpu_lookup_table(base + j, nid);
@@ -1305,7 +1306,7 @@ int numa_update_cpu_topology(bool cpus_locked)
 	struct topology_update_data *updates, *ud;
 	cpumask_t updated_cpus;
 	struct device *dev;
-	int weight, new_nid, i = 0;
+	int weight, new_nid, i = 0, ii;
 
 	if (!prrn_enabled && !vphn_enabled && topology_inited)
 		return 0;
@@ -1349,12 +1350,16 @@ int numa_update_cpu_topology(bool cpus_locked)
 			continue;
 		}
 
+		ii = 0;
 		for_each_cpu(sibling, cpu_sibling_mask(cpu)) {
 			ud = &updates[i++];
 			ud->next = &updates[i];
-			ud->cpu = sibling;
 			ud->new_nid = new_nid;
 			ud->old_nid = numa_cpu_lookup_table[sibling];
+			ud->old_cpu = sibling;
+			ud->new_cpu = cpuremap_map_cpu(
+					get_hard_smp_processor_id(sibling),
+					ii++, new_nid);
 			cpumask_set_cpu(sibling, &updated_cpus);
 		}
 		cpu = cpu_last_thread_sibling(cpu);
@@ -1370,9 +1375,10 @@ int numa_update_cpu_topology(bool cpus_locked)
 	pr_debug("Topology update for the following CPUs:\n");
 	if (cpumask_weight(&updated_cpus)) {
 		for (ud = &updates[0]; ud; ud = ud->next) {
-			pr_debug("cpu %d moving from node %d "
-					  "to %d\n", ud->cpu,
-					  ud->old_nid, ud->new_nid);
+			pr_debug("cpu %d, node %d moving to"
+				 " cpu %d, node %d\n",
+				 ud->old_cpu, ud->old_nid,
+				 ud->new_cpu, ud->new_nid);
 		}
 	}
 
@@ -1409,13 +1415,20 @@ int numa_update_cpu_topology(bool cpus_locked)
 			     cpumask_of(raw_smp_processor_id()));
 
 	for (ud = &updates[0]; ud; ud = ud->next) {
-		unregister_cpu_under_node(ud->cpu, ud->old_nid);
-		register_cpu_under_node(ud->cpu, ud->new_nid);
+		unregister_cpu_under_node(ud->old_cpu, ud->old_nid);
+		register_cpu_under_node(ud->new_cpu, ud->new_nid);
 
-		dev = get_cpu_device(ud->cpu);
+		dev = get_cpu_device(ud->old_cpu);
 		if (dev)
 			kobject_uevent(&dev->kobj, KOBJ_CHANGE);
-		cpumask_clear_cpu(ud->cpu, &cpu_associativity_changes_mask);
+		cpumask_clear_cpu(ud->old_cpu, &cpu_associativity_changes_mask);
+		if (ud->old_cpu != ud->new_cpu) {
+			dev = get_cpu_device(ud->new_cpu);
+			if (dev)
+				kobject_uevent(&dev->kobj, KOBJ_CHANGE);
+			cpumask_clear_cpu(ud->new_cpu,
+				&cpu_associativity_changes_mask);
+		}
 		changed = 1;
 	}
 
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 620cb57..3a11a31 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -259,8 +259,13 @@ static int pseries_add_processor(struct device_node *np)
 	zalloc_cpumask_var(&tmp, GFP_KERNEL);
 
 	nthreads = len / sizeof(u32);
-	for (i = 0; i < nthreads; i++)
-		cpumask_set_cpu(i, tmp);
+	for (i = 0; i < nthreads; i++) {
+		int thread_index = be32_to_cpu(intserv[i]);
+		int nid = find_and_online_cpu_nid(thread_index, false);
+		int cpu = cpuremap_map_cpu(thread_index, i, nid);
+		cpumask_set_cpu(cpu, tmp);
+		cpuremap_reserve_cpu(cpu);
+	}
 
 	cpu_maps_update_begin();
 
@@ -333,6 +338,7 @@ static void pseries_remove_processor(struct device_node *np)
 			set_cpu_present(cpu, false);
 			set_hard_smp_processor_id(cpu, -1);
 			update_numa_cpu_lookup_table(cpu, -1);
+			cpuremap_release_cpu(cpu);
 			break;
 		}
 		if (cpu >= nr_cpu_ids)
@@ -346,7 +352,7 @@ static int dlpar_online_cpu(struct device_node *dn)
 {
 	int rc = 0;
 	unsigned int cpu;
-	int len, nthreads, i;
+	int len, nthreads, i, nid;
 	const __be32 *intserv;
 	u32 thread;
 
@@ -367,9 +373,11 @@ static int dlpar_online_cpu(struct device_node *dn)
 			cpu_maps_update_done();
 			timed_topology_update(1);
 			find_and_online_cpu_nid(cpu, true);
+			cpuremap_map_cpu(thread, i, nid);
 			rc = device_online(get_cpu_device(cpu));
 			if (rc)
 				goto out;
+			cpuremap_reserve_cpu(cpu);
 			cpu_maps_update_begin();
 
 			break;
@@ -541,6 +549,7 @@ static int dlpar_offline_cpu(struct device_node *dn)
 				rc = device_offline(get_cpu_device(cpu));
 				if (rc)
 					goto out;
+				cpuremap_release_cpu(cpu);
 				cpu_maps_update_begin();
 				break;
 


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-12-11 22:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-11 22:03 [RFC 0/3] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
2018-12-11 22:03 ` [RFC 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
2018-12-11 22:03 ` [RFC 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
2018-12-11 22:04 ` [RFC 3/3] powerpc/numa: Apply " Michael Bringmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).