Michal Hocko <mhocko@xxxxxxxxxx> writes: > On Thu 27-02-20 19:26:54, Michal Hocko wrote: >> [Cc ppc maintainers] > [...] >> Please have a look at http://lkml.kernel.org/r/52EF4673-7292-4C4C-B459-AF583951BA48@xxxxxxxxxxxxxxxxxx >> for the boot log with the debugging patch which tracks set_numa_mem. >> This seems to lead to a crash in the slab allocator bebcause >> node_to_mem_node(0) for memory less node resolves to the memory less >> node http://lkml.kernel.org/r/dd450314-d428-6776-af07-f92c04c7b967@xxxxxxx. >> The original report is http://lkml.kernel.org/r/3381CD91-AB3D-4773-BA04-E7A072A63968@xxxxxxxxxxxxxxxxxx > > ping The obvious fix is: diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 37c12e3bab9e..33b1fca0b258 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -892,6 +892,7 @@ void smp_prepare_boot_cpu(void) paca_ptrs[boot_cpuid]->__current = current; #endif set_numa_node(numa_cpu_lookup_table[boot_cpuid]); + set_numa_mem(local_memory_node(numa_cpu_lookup_table[boot_cpuid])); current_set[boot_cpuid] = current; } But that doesn't work because smp_prepare_boot_cpu() is called too early: asmlinkage __visible void __init start_kernel(void) { ... smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ boot_cpu_hotplug_init(); build_all_zonelists(NULL); And local_memory_node() uses first_zones_zonelist() which doesn't work prior to build_all_zonelists() being called. The patch below might work. Sachin can you test this? I tried faking up a system with a memoryless node zero but couldn't get it to even start booting. cheers diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 9b4f5fb719e0..d1f11437f6c4 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -282,6 +282,9 @@ void __init mem_init(void) */ BUILD_BUG_ON(MMU_PAGE_COUNT > 16); + BUG_ON(smp_processor_id() != boot_cpuid); + set_numa_mem(local_memory_node(numa_cpu_lookup_table[boot_cpuid])); + #ifdef CONFIG_SWIOTLB /* * Some platforms (e.g. 85xx) limit DMA-able memory way below