RE: [PATCH v10 1/3] mm: Add node_to_range lookup facility to numa_memblks
From: Shiju Jose <hidden>
Date: 2025-08-05 16:37:03
Also in:
linux-acpi, linux-edac, linux-mm
-----Original Message----- From: Mike Rapoport <rppt@kernel.org> Sent: 05 August 2025 11:20 To: Shiju Jose <redacted> Cc: rafael@kernel.org; bp@alien8.de; akpm@linux-foundation.org; dferguson@amperecomputing.com; linux-edac@vger.kernel.org; linux- acpi@vger.kernel.org; linux-mm@kvack.org; linux-doc@vger.kernel.org; tony.luck@intel.com; lenb@kernel.org; leo.duran@amd.com; Yazen.Ghannam@amd.com; mchehab@kernel.org; Jonathan Cameron [off-list ref]; Linuxarm [off-list ref]; rientjes@google.com; jiaqiyan@google.com; Jon.Grimm@amd.com; dave.hansen@linux.intel.com; naoya.horiguchi@nec.com; james.morse@arm.com; jthoughton@google.com; somasundaram.a@hpe.com; erdemaktas@google.com; pgonda@google.com; duenwen@google.com; gthelen@google.com; wschwartz@amperecomputing.com; wbs@os.amperecomputing.com; nifan.cxl@gmail.com; tanxiaofei [off-list ref]; Zengtao (B) [off-list ref]; Roberto Sassu [off-list ref]; kangkang.shen@futurewei.com; wanghuiqiang [off-list ref] Subject: Re: [PATCH v10 1/3] mm: Add node_to_range lookup facility to numa_memblks On Fri, Aug 01, 2025 at 06:20:27PM +0100, shiju.jose@huawei.com wrote:quoted
From: Shiju Jose <redacted> Lookup facility to retrieve memory phys lowest continuous range for a NUMA node is required in the numa_memblks for the ACPI RAS2 memory scrub use case.If the code that needs to find the lowest contiguous range in a node runs before we discard .init you can just use unsigned long pfn = node_start_pfn(nid); unsigned long start_pfn, end_pfn; memblock_search_pfn_nid(pfn, &start_pfn, &end_pfn);
Thanks Mike for your suggestion and help. With node_start_pfn(nid) and memblock_search_pfn_nid(), the 'end_pfn' return different value than the actual. Found similar function get_pfn_range_for_nid(nid, &start_pfn, &end_pfn), seems more suitable as it takes 'nid' directly and both 'start_pfn' and 'end_pfn 'return correct values. Thanks, Shiju
quoted
Suggested-by: Jonathan Cameron <jonathan.cameron@huawei.com> Signed-off-by: Shiju Jose <redacted> --- include/linux/numa.h | 10 ++++++++++ include/linux/numa_memblks.h | 2 ++ mm/numa.c | 10 ++++++++++ mm/numa_memblks.c | 23 +++++++++++++++++++++++ 4 files changed, 45 insertions(+)diff --git a/include/linux/numa.h b/include/linux/numa.h indexe6baaf6051bc..d41e583a902d 100644--- a/include/linux/numa.h +++ b/include/linux/numa.h@@ -41,6 +41,10 @@ int memory_add_physaddr_to_nid(u64 start); intphys_to_target_node(u64 start); #endif +#ifndef node_to_phys_lowest_continuous_range +int node_to_phys_lowest_continuous_range(int nid, u64 *start, u64 +*end); #endif + int numa_fill_memblks(u64 start, u64 end); #else /* !CONFIG_NUMA */@@ -63,6 +67,12 @@ static inline int phys_to_target_node(u64 start) return 0; } +static inline int node_to_phys_lowest_continuous_range(int nid, u64 *start, + u64 *end) +{ + return 0; +} + static inline void alloc_offline_node_data(int nid) {} #endifdiff --git a/include/linux/numa_memblks.hb/include/linux/numa_memblks.h index 991076cba7c5..ccc53029de8b 100644--- a/include/linux/numa_memblks.h +++ b/include/linux/numa_memblks.h@@ -55,6 +55,8 @@ extern int phys_to_target_node(u64 start); #definephys_to_target_node phys_to_target_node extern int memory_add_physaddr_to_nid(u64 start); #define memory_add_physaddr_to_nid memory_add_physaddr_to_nid +extern int node_to_phys_lowest_continuous_range(int nid, u64 *start, +u64 *end); #define node_to_phys_lowest_continuous_range +node_to_phys_lowest_continuous_range #endif /* CONFIG_NUMA_KEEP_MEMINFO */ #endif /* CONFIG_NUMA_MEMBLKS */diff --git a/mm/numa.c b/mm/numa.c index 7d5e06fe5bd4..0affb56ef4f2 100644 --- a/mm/numa.c +++ b/mm/numa.c@@ -59,3 +59,13 @@ int phys_to_target_node(u64 start) }EXPORT_SYMBOL_GPL(phys_to_target_node); #endif + +#ifndef node_to_phys_lowest_continuous_range +int node_to_phys_lowest_continuous_range(int nid, u64 *start, u64 +*end) { + pr_info_once("Unknown target phys addr range for node=%d\n", nid); + + return 0; +} +EXPORT_SYMBOL_GPL(node_to_phys_lowest_continuous_range); +#endifdiff --git a/mm/numa_memblks.c b/mm/numa_memblks.c index541a99c4071a..9cbaa38cb92d 100644--- a/mm/numa_memblks.c +++ b/mm/numa_memblks.c@@ -590,4 +590,27 @@ int memory_add_physaddr_to_nid(u64 start) }EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); +static int nid_to_meminfo(struct numa_meminfo *mi, int nid, u64 +*start, u64 *end) { + int i; + + if (!numa_valid_node(nid)) + return -EINVAL; + + for (i = 0; i < mi->nr_blks; i++) { + if (mi->blk[i].nid == nid) { + *start = mi->blk[i].start; + *end = mi->blk[i].end; + return 0; + } + } + + return -ENODEV; +} + +int node_to_phys_lowest_continuous_range(int nid, u64 *start, u64 +*end) { + return nid_to_meminfo(&numa_meminfo, nid, start, end); } +EXPORT_SYMBOL_GPL(node_to_phys_lowest_continuous_range); #endif /* CONFIG_NUMA_KEEP_MEMINFO */ -- 2.43.0-- Sincerely yours, Mike.