linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes
@ 2018-11-26 20:33 Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Michael Bringmann @ 2018-11-26 20:33 UTC (permalink / raw)
  To: Michael Ellerman, Michael Bringmann, Tyrel Datwyler,
	Thomas Falcon, Juliet Kim, Srikar Dronamraju,
	Vaidyanathan Srinivasan, linuxppc-dev

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] 5+ messages in thread

* [Internal Review PATCH 1/3] powerpc/numa: Conditionally online new nodes
  2018-11-26 20:33 [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
@ 2018-11-26 20:34 ` Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Bringmann @ 2018-11-26 20:34 UTC (permalink / raw)
  To: Michael Bringmann, Michael Ellerman, Juliet Kim, Tyrel Datwyler,
	Thomas Falcon, Vaidyanathan Srinivasan, Srikar Dronamraju,
	linuxppc-dev

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 3a048e9..460d60f 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] 5+ messages in thread

* [Internal Review PATCH 2/3] powerpc/numa: Define mapping between HW and kernel cpus
  2018-11-26 20:33 [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
@ 2018-11-26 20:34 ` Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 3/3] powerpc/numa: Apply " Michael Bringmann
  2018-11-27 20:28 ` [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Bringmann @ 2018-11-26 20:34 UTC (permalink / raw)
  To: Michael Bringmann, Michael Ellerman, Srikar Dronamraju,
	Vaidyanathan Srinivasan, Juliet Kim, Tyrel Datwyler,
	Thomas Falcon, linuxppc-dev

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] 5+ messages in thread

* [Internal Review PATCH 3/3] powerpc/numa: Apply mapping between HW and kernel cpus
  2018-11-26 20:33 [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
  2018-11-26 20:34 ` [Internal Review PATCH 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
@ 2018-11-26 20:34 ` Michael Bringmann
  2018-11-27 20:28 ` [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Bringmann @ 2018-11-26 20:34 UTC (permalink / raw)
  To: Michael Bringmann, Michael Ellerman, Srikar Dronamraju,
	Vaidyanathan Srinivasan, Juliet Kim, Tyrel Datwyler,
	Thomas Falcon, linuxppc-dev

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 460d60f..9825fc9 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] 5+ messages in thread

* Re: [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes
  2018-11-26 20:33 [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
                   ` (2 preceding siblings ...)
  2018-11-26 20:34 ` [Internal Review PATCH 3/3] powerpc/numa: Apply " Michael Bringmann
@ 2018-11-27 20:28 ` Michael Bringmann
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Bringmann @ 2018-11-27 20:28 UTC (permalink / raw)
  To: Michael Ellerman, Tyrel Datwyler, Thomas Falcon, Juliet Kim,
	Srikar Dronamraju, Vaidyanathan Srinivasan, linuxppc-dev

This should have been posted as RFC.  Will repost.

On 11/26/2018 02:33 PM, Michael Bringmann wrote:
> 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
> 
> 

-- 
Michael W. Bringmann
Linux Technology Center
IBM Corporation
Tie-Line  363-5196
External: (512) 286-5196
Cell:       (512) 466-0650
mwb@linux.vnet.ibm.com


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

end of thread, other threads:[~2018-11-27 20:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-26 20:33 [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes Michael Bringmann
2018-11-26 20:34 ` [Internal Review PATCH 1/3] powerpc/numa: Conditionally online new nodes Michael Bringmann
2018-11-26 20:34 ` [Internal Review PATCH 2/3] powerpc/numa: Define mapping between HW and kernel cpus Michael Bringmann
2018-11-26 20:34 ` [Internal Review PATCH 3/3] powerpc/numa: Apply " Michael Bringmann
2018-11-27 20:28 ` [Internal Review PATCH] powerpc/pseries: Remap hw to kernel cpu indexes 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).