Message ID | 20240529171236.32002-7-Jonathan.Cameron@huawei.com |
---|---|
State | New, archived |
Headers | show |
Series | arm64/memblock: Handling of CXL Fixed Memory Windows. | expand |
On Wed, May 29, 2024 at 06:12:34PM +0100, Jonathan Cameron wrote: > CXL memory hotplug relies on additional NUMA nodes being created > for any CXL Fixed Memory Window if there is no suitable one created > by system firmware. To detect if system firmware has created one look > for any normal memblock that overlaps with the Fixed Memory Window that > has a NUMA node (nid) set. > > If one is found, add a region with the same nid to memblock.reserved > so we can match it later when CXL memory is hotplugged. > If not, add a region anyway because a suitable NUMA node will be > set later. So for now use NUMA_NO_NODE. > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > arch/arm64/mm/init.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index 6a2f21b1bb58..27941f22db1c 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -50,6 +50,32 @@ > > #ifdef CONFIG_NUMA > > +/* > + * Scan existing memblocks and if this region overlaps with a region with > + * a nid set, add a reserved memblock. > + */ > +int __init numa_fill_memblks(u64 start, u64 end) > +{ > + struct memblock_region *region; > + > + for_each_mem_region(region) { > + int nid = memblock_get_region_node(region); > + > + if (nid == NUMA_NO_NODE) > + continue; > + if (!(end < region->base || start >= region->base + region->size)) { > + memblock_add_reserved_node(start, end - start, nid, > + MEMBLOCK_RSRV_NOINIT); > + return 0; > + } > + } > + > + memblock_add_reserved_node(start, end - start, NUMA_NO_NODE, > + MEMBLOCK_RSRV_NOINIT); > + > + return NUMA_NO_MEMBLK; > +} > + > static int __memory_add_physaddr_to_nid(u64 addr) > { > unsigned long start_pfn, end_pfn, pfn = PHYS_PFN(addr); > -- > 2.39.2 > Tested-off-by: Yuquan Wang <wangyuquan1236@phytium.com.cn>
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 6a2f21b1bb58..27941f22db1c 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -50,6 +50,32 @@ #ifdef CONFIG_NUMA +/* + * Scan existing memblocks and if this region overlaps with a region with + * a nid set, add a reserved memblock. + */ +int __init numa_fill_memblks(u64 start, u64 end) +{ + struct memblock_region *region; + + for_each_mem_region(region) { + int nid = memblock_get_region_node(region); + + if (nid == NUMA_NO_NODE) + continue; + if (!(end < region->base || start >= region->base + region->size)) { + memblock_add_reserved_node(start, end - start, nid, + MEMBLOCK_RSRV_NOINIT); + return 0; + } + } + + memblock_add_reserved_node(start, end - start, NUMA_NO_NODE, + MEMBLOCK_RSRV_NOINIT); + + return NUMA_NO_MEMBLK; +} + static int __memory_add_physaddr_to_nid(u64 addr) { unsigned long start_pfn, end_pfn, pfn = PHYS_PFN(addr);
CXL memory hotplug relies on additional NUMA nodes being created for any CXL Fixed Memory Window if there is no suitable one created by system firmware. To detect if system firmware has created one look for any normal memblock that overlaps with the Fixed Memory Window that has a NUMA node (nid) set. If one is found, add a region with the same nid to memblock.reserved so we can match it later when CXL memory is hotplugged. If not, add a region anyway because a suitable NUMA node will be set later. So for now use NUMA_NO_NODE. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> --- arch/arm64/mm/init.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)