]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
LoongArch: Fix NUMA node parsing with numa_memblks
authorBibo Mao <maobibo@loongson.cn>
Thu, 20 Nov 2025 06:42:05 +0000 (14:42 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 20 Nov 2025 06:42:05 +0000 (14:42 +0800)
On physical machine, NUMA node id comes from high bit 44:48 of physical
address. However it is not true on virt machine. With general method, it
comes from ACPI SRAT table.

Here the common function numa_memblks_init() is used to parse NUMA node
information with numa_memblks.

Cc: <stable@vger.kernel.org>
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/numa.c

index ab9c660526a3452052a6062b3c9ea80c3512c36c..8b89898e20df1017226ea3a2526da87b8b33f404 100644 (file)
@@ -158,35 +158,9 @@ static void __init node_mem_init(unsigned int node)
 
 #ifdef CONFIG_ACPI_NUMA
 
-/*
- * add_numamem_region
- *
- * Add a uasable memory region described by BIOS. The
- * routine gets each intersection between BIOS's region
- * and node's region, and adds them into node's memblock
- * pool.
- *
- */
-static void __init add_numamem_region(u64 start, u64 end, u32 type)
-{
-       u32 node = pa_to_nid(start);
-       u64 size = end - start;
-       static unsigned long num_physpages;
-
-       if (start >= end) {
-               pr_debug("Invalid region: %016llx-%016llx\n", start, end);
-               return;
-       }
+static unsigned long num_physpages;
 
-       num_physpages += (size >> PAGE_SHIFT);
-       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx Bytes\n",
-               node, type, start, size);
-       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
-               start >> PAGE_SHIFT, end >> PAGE_SHIFT, num_physpages);
-       memblock_set_node(start, size, &memblock.memory, node);
-}
-
-static void __init init_node_memblock(void)
+static void __init info_node_memblock(void)
 {
        u32 mem_type;
        u64 mem_end, mem_start, mem_size;
@@ -206,12 +180,20 @@ static void __init init_node_memblock(void)
                case EFI_BOOT_SERVICES_DATA:
                case EFI_PERSISTENT_MEMORY:
                case EFI_CONVENTIONAL_MEMORY:
-                       add_numamem_region(mem_start, mem_end, mem_type);
+                       num_physpages += (mem_size >> PAGE_SHIFT);
+                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx Bytes\n",
+                               (u32)pa_to_nid(mem_start), mem_type, mem_start, mem_size);
+                       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
+                               mem_start >> PAGE_SHIFT, mem_end >> PAGE_SHIFT, num_physpages);
                        break;
                case EFI_PAL_CODE:
                case EFI_UNUSABLE_MEMORY:
                case EFI_ACPI_RECLAIM_MEMORY:
-                       add_numamem_region(mem_start, mem_end, mem_type);
+                       num_physpages += (mem_size >> PAGE_SHIFT);
+                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx Bytes\n",
+                               (u32)pa_to_nid(mem_start), mem_type, mem_start, mem_size);
+                       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
+                               mem_start >> PAGE_SHIFT, mem_end >> PAGE_SHIFT, num_physpages);
                        fallthrough;
                case EFI_RESERVED_TYPE:
                case EFI_RUNTIME_SERVICES_CODE:
@@ -249,22 +231,16 @@ int __init init_numa_memory(void)
        for (i = 0; i < NR_CPUS; i++)
                set_cpuid_to_node(i, NUMA_NO_NODE);
 
-       numa_reset_distance();
-       nodes_clear(numa_nodes_parsed);
-       nodes_clear(node_possible_map);
-       nodes_clear(node_online_map);
-       WARN_ON(memblock_clear_hotplug(0, PHYS_ADDR_MAX));
-
        /* Parse SRAT and SLIT if provided by firmware. */
-       ret = acpi_disabled ? fake_numa_init() : acpi_numa_init();
+       if (!acpi_disabled)
+               ret = numa_memblks_init(acpi_numa_init, false);
+       else
+               ret = numa_memblks_init(fake_numa_init, false);
+
        if (ret < 0)
                return ret;
 
-       node_possible_map = numa_nodes_parsed;
-       if (WARN_ON(nodes_empty(node_possible_map)))
-               return -EINVAL;
-
-       init_node_memblock();
+       info_node_memblock();
        if (!memblock_validate_numa_coverage(SZ_1M))
                return -EINVAL;