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 <a...@linux-foundation.org>
Cc: linux...@kvack.org
Cc: Mel Gorman <mgor...@suse.de>
Cc: Michael Ellerman <m...@ellerman.id.au>
Cc: Sachin Sant <sach...@linux.vnet.ibm.com>
Cc: Michal Hocko <mho...@kernel.org>
Cc: Christopher Lameter <c...@linux.com>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: Joonsoo Kim <iamjoonsoo....@lge.com>
Cc: Kirill Tkhai <ktk...@virtuozzo.com>
Cc: Vlastimil Babka <vba...@suse.cz>
Cc: Srikar Dronamraju <sri...@linux.vnet.ibm.com>
Cc: Bharata B Rao <bhar...@linux.ibm.com>
Cc: Nathan Lynch <nath...@linux.ibm.com>

Reported-by: Sachin Sant <sach...@linux.vnet.ibm.com>
Tested-by: Sachin Sant <sach...@linux.vnet.ibm.com>
Signed-off-by: Srikar Dronamraju <sri...@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

Reply via email to