| From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> |
| Subject: cma: split reservation of fixed area into a helper function |
| Date: Thu, 3 Jul 2025 21:47:10 +0300 |
| |
| Move the check that verifies that reservation of fixed area does not cross |
| HIGHMEM boundary and the actual memblock_resrve() call into a helper |
| function. |
| |
| This makes code more readable and decouples logic related to |
| CONFIG_HIGHMEM from the core functionality of |
| __cma_declare_contiguous_nid(). |
| |
| Link: https://lkml.kernel.org/r/20250703184711.3485940-3-rppt@kernel.org |
| Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> |
| Acked-by: Oscar Salvador <osalvador@suse.de> |
| Acked-by: David Hildenbrand <david@redhat.com> |
| Cc: Alexandre Ghiti <alexghiti@rivosinc.com> |
| Cc: Pratyush Yadav <ptyadav@amazon.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/cma.c | 40 +++++++++++++++++++++++++++------------- |
| 1 file changed, 27 insertions(+), 13 deletions(-) |
| |
| --- a/mm/cma.c~cma-split-resrvation-of-fixed-area-into-a-helper-function |
| +++ a/mm/cma.c |
| @@ -353,6 +353,30 @@ static void __init list_insert_sorted( |
| } |
| } |
| |
| +static int __init cma_fixed_reserve(phys_addr_t base, phys_addr_t size) |
| +{ |
| + if (IS_ENABLED(CONFIG_HIGHMEM)) { |
| + phys_addr_t highmem_start = __pa(high_memory - 1) + 1; |
| + |
| + /* |
| + * If allocating at a fixed base the request region must not |
| + * cross the low/high memory boundary. |
| + */ |
| + if (base < highmem_start && base + size > highmem_start) { |
| + pr_err("Region at %pa defined on low/high memory boundary (%pa)\n", |
| + &base, &highmem_start); |
| + return -EINVAL; |
| + } |
| + } |
| + |
| + if (memblock_is_region_reserved(base, size) || |
| + memblock_reserve(base, size) < 0) { |
| + return -EBUSY; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| static int __init __cma_declare_contiguous_nid(phys_addr_t *basep, |
| phys_addr_t size, phys_addr_t limit, |
| phys_addr_t alignment, unsigned int order_per_bit, |
| @@ -408,15 +432,6 @@ static int __init __cma_declare_contiguo |
| if (!IS_ALIGNED(size >> PAGE_SHIFT, 1 << order_per_bit)) |
| return -EINVAL; |
| |
| - /* |
| - * If allocating at a fixed base the request region must not cross the |
| - * low/high memory boundary. |
| - */ |
| - if (fixed && base < highmem_start && base + size > highmem_start) { |
| - pr_err("Region at %pa defined on low/high memory boundary (%pa)\n", |
| - &base, &highmem_start); |
| - return -EINVAL; |
| - } |
| |
| /* |
| * If the limit is unspecified or above the memblock end, its effective |
| @@ -434,10 +449,9 @@ static int __init __cma_declare_contiguo |
| |
| /* Reserve memory */ |
| if (fixed) { |
| - if (memblock_is_region_reserved(base, size) || |
| - memblock_reserve(base, size) < 0) { |
| - return -EBUSY; |
| - } |
| + ret = cma_fixed_reserve(base, size); |
| + if (ret) |
| + return ret; |
| } else { |
| phys_addr_t addr = 0; |
| |
| _ |