[PATCH v2 4/4] powerpc/numa: Set fallback nodes for offline nodes

Srikar Dronamraju srikar at linux.vnet.ibm.com
Wed Mar 18 18:28:10 AEDT 2020


Currently fallback nodes for offline nodes aren't set. Hence by default
node 0 ends up being the default node. However node 0 might be offline.

Fix this by explicitly setting fallback node. Ensure first_memory_node
is set before kernel does explicit setting of fallback node.

Cc: Andrew Morton <akpm at linux-foundation.org>
Cc: linux-mm at kvack.org
Cc: Mel Gorman <mgorman at suse.de>
Cc: Michael Ellerman <mpe at ellerman.id.au>
Cc: Sachin Sant <sachinp at linux.vnet.ibm.com>
Cc: Michal Hocko <mhocko at kernel.org>
Cc: Christopher Lameter <cl at linux.com>
Cc: linuxppc-dev at lists.ozlabs.org
Cc: Joonsoo Kim <iamjoonsoo.kim at lge.com>
Cc: Kirill Tkhai <ktkhai at virtuozzo.com>
Cc: Vlastimil Babka <vbabka at suse.cz>
Cc: Srikar Dronamraju <srikar at linux.vnet.ibm.com>
Cc: Bharata B Rao <bharata at linux.ibm.com>
Cc: Nathan Lynch <nathanl at linux.ibm.com>

Reported-by: Sachin Sant <sachinp at linux.vnet.ibm.com>
Tested-by: Sachin Sant <sachinp at linux.vnet.ibm.com>
Signed-off-by: Srikar Dronamraju <srikar at linux.vnet.ibm.com>
---
Changelog v1 -> v2:
- Handled comments from Bharata B Rao
	- Dont use dump_numa_cpu_topology to set fallback nodes

 arch/powerpc/include/asm/topology.h | 16 ++++++++++++++++
 arch/powerpc/kernel/smp.c           |  1 +
 2 files changed, 17 insertions(+)

diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index 2db7ba789720..baa89364197c 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -62,6 +62,21 @@ static inline int early_cpu_to_node(int cpu)
 	 */
 	return (nid < 0) ? 0 : nid;
 }
+
+static inline int update_default_numa_mem(void)
+{
+	unsigned int node;
+
+	for_each_node(node) {
+		/*
+		 * For all possible but not yet online nodes, ensure their
+		 * node_numa_mem is set correctly so that kmalloc_node works
+		 * for such nodes.
+		 */
+		if (!node_online(node))
+			reset_numa_mem(node);
+	}
+}
 #else
 
 static inline int early_cpu_to_node(int cpu) { return 0; }
@@ -90,6 +105,7 @@ static inline int cpu_distance(__be32 *cpu1_assoc, __be32 *cpu2_assoc)
 	return 0;
 }
 
+static inline int update_default_numa_mem(void) {}
 #endif /* CONFIG_NUMA */
 
 #if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 37c12e3bab9e..d23faa70ea2d 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -1383,6 +1383,7 @@ void __init smp_cpus_done(unsigned int max_cpus)
 	if (smp_ops && smp_ops->bringup_done)
 		smp_ops->bringup_done();
 
+	update_default_numa_mem();
 	dump_numa_cpu_topology();
 
 #ifdef CONFIG_SCHED_SMT
-- 
2.18.1



More information about the Linuxppc-dev mailing list