[PATCH v2 2/4] LoongArch: smp: Add all CPUs enabled by fdt to NUMA node 0

Jiaxun Yang posted 4 patches 1 year, 8 months ago
There is a newer version of this series
[PATCH v2 2/4] LoongArch: smp: Add all CPUs enabled by fdt to NUMA node 0
Posted by Jiaxun Yang 1 year, 8 months ago
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 for now.

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>
---
 arch/loongarch/kernel/smp.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
index 0dfe2388ef41..866757b76ecb 100644
--- a/arch/loongarch/kernel/smp.c
+++ b/arch/loongarch/kernel/smp.c
@@ -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,10 @@ 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);
+		numa_add_cpu(cpu);
 	}
 
 	loongson_sysconf.nr_cpus = num_processors;

-- 
2.43.0
Re: [PATCH v2 2/4] LoongArch: smp: Add all CPUs enabled by fdt to NUMA node 0
Posted by Huacai Chen 1 year, 8 months ago
Hi, Jiaxun,

On Wed, May 22, 2024 at 2:30 PM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>
> 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 for now.
>
> 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>
> ---
>  arch/loongarch/kernel/smp.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/loongarch/kernel/smp.c b/arch/loongarch/kernel/smp.c
> index 0dfe2388ef41..866757b76ecb 100644
> --- a/arch/loongarch/kernel/smp.c
> +++ b/arch/loongarch/kernel/smp.c
> @@ -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,10 @@ 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);
> +               numa_add_cpu(cpu);
What's wrong exactly? Real machine has no problem here, and at least
numa_add_cpu() should not be called for non-zero cpu so early, because
it need per-cpu area be setup. I guess the root cause is that there is
something wrong and "cpuid == loongson_sysconf.boot_cpu_id" is
skipped.

Huacai

>         }
>
>         loongson_sysconf.nr_cpus = num_processors;
>
> --
> 2.43.0
>