LoongArch: Add all CPUs enabled by fdt to NUMA node 0
authorJiaxun Yang <jiaxun.yang@flygoat.com>
Mon, 3 Jun 2024 07:45:53 +0000 (15:45 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 3 Jun 2024 07:45:53 +0000 (15:45 +0800)
NUMA enabled kernel on FDT based machine fails to boot because CPUs
are all in NUMA_NO_NODE and mm subsystem won't accept that.

Fix by adding them to default NUMA node at FDT parsing phase and move
numa_add_cpu(0) to a later point.

Cc: stable@vger.kernel.org
Fixes: 88d4d957edc7 ("LoongArch: Add FDT booting support from efi system table")
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/numa.h
arch/loongarch/kernel/smp.c

index 27f319b498625718d2349618d39008327b2f9935..b5f9de9f102e444bcb4e563bddc704f52f3a940e 100644 (file)
@@ -56,6 +56,7 @@ extern int early_cpu_to_node(int cpu);
 static inline void early_numa_add_cpu(int cpuid, s16 node)     { }
 static inline void numa_add_cpu(unsigned int cpu)              { }
 static inline void numa_remove_cpu(unsigned int cpu)           { }
+static inline void set_cpuid_to_node(int cpuid, s16 node)      { }
 
 static inline int early_cpu_to_node(int cpu)
 {
index 0dfe2388ef413b673185ab88951b06c532559fff..1436d2465939b2d79744833c8c5a4abe3ead8916 100644 (file)
@@ -273,7 +273,6 @@ static void __init fdt_smp_setup(void)
 
                if (cpuid == loongson_sysconf.boot_cpu_id) {
                        cpu = 0;
-                       numa_add_cpu(cpu);
                } else {
                        cpu = cpumask_next_zero(-1, cpu_present_mask);
                }
@@ -283,6 +282,9 @@ static void __init fdt_smp_setup(void)
                set_cpu_present(cpu, true);
                __cpu_number_map[cpuid] = cpu;
                __cpu_logical_map[cpu] = cpuid;
+
+               early_numa_add_cpu(cpu, 0);
+               set_cpuid_to_node(cpuid, 0);
        }
 
        loongson_sysconf.nr_cpus = num_processors;
@@ -468,6 +470,7 @@ void smp_prepare_boot_cpu(void)
        set_cpu_possible(0, true);
        set_cpu_online(0, true);
        set_my_cpu_offset(per_cpu_offset(0));
+       numa_add_cpu(0);
 
        rr_node = first_node(node_online_map);
        for_each_possible_cpu(cpu) {