* [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).