LoongArch: Fix NUMA node parsing with numa_memblks
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>pull/1354/merge
parent
1c004609fd
commit
acf5de1b23
|
|
@ -158,35 +158,9 @@ static void __init node_mem_init(unsigned int node)
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_NUMA
|
#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;
|
static unsigned long num_physpages;
|
||||||
|
|
||||||
if (start >= end) {
|
static void __init info_node_memblock(void)
|
||||||
pr_debug("Invalid region: %016llx-%016llx\n", start, end);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
u32 mem_type;
|
u32 mem_type;
|
||||||
u64 mem_end, mem_start, mem_size;
|
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_BOOT_SERVICES_DATA:
|
||||||
case EFI_PERSISTENT_MEMORY:
|
case EFI_PERSISTENT_MEMORY:
|
||||||
case EFI_CONVENTIONAL_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;
|
break;
|
||||||
case EFI_PAL_CODE:
|
case EFI_PAL_CODE:
|
||||||
case EFI_UNUSABLE_MEMORY:
|
case EFI_UNUSABLE_MEMORY:
|
||||||
case EFI_ACPI_RECLAIM_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;
|
fallthrough;
|
||||||
case EFI_RESERVED_TYPE:
|
case EFI_RESERVED_TYPE:
|
||||||
case EFI_RUNTIME_SERVICES_CODE:
|
case EFI_RUNTIME_SERVICES_CODE:
|
||||||
|
|
@ -249,22 +231,16 @@ int __init init_numa_memory(void)
|
||||||
for (i = 0; i < NR_CPUS; i++)
|
for (i = 0; i < NR_CPUS; i++)
|
||||||
set_cpuid_to_node(i, NUMA_NO_NODE);
|
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. */
|
/* 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)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
node_possible_map = numa_nodes_parsed;
|
info_node_memblock();
|
||||||
if (WARN_ON(nodes_empty(node_possible_map)))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
init_node_memblock();
|
|
||||||
if (!memblock_validate_numa_coverage(SZ_1M))
|
if (!memblock_validate_numa_coverage(SZ_1M))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue