From: Shiju Jose <shiju.jose@xxxxxxxxxx> 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. Suggested-by: Jonathan Cameron <jonathan.cameron@xxxxxxxxxx> Signed-off-by: Shiju Jose <shiju.jose@xxxxxxxxxx> --- 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 index e6baaf6051bc..d41e583a902d 100644 --- a/include/linux/numa.h +++ b/include/linux/numa.h @@ -41,6 +41,10 @@ int memory_add_physaddr_to_nid(u64 start); int phys_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) {} #endif diff --git a/include/linux/numa_memblks.h b/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); #define phys_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); +#endif diff --git a/mm/numa_memblks.c b/mm/numa_memblks.c index 541a99c4071a..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