]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cma: split reservation of fixed area into a helper function
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Thu, 3 Jul 2025 18:47:10 +0000 (21:47 +0300)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 13 Jul 2025 23:38:24 +0000 (16:38 -0700)
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

index 19d0371abff83a128fa23f917f76270b572d7b1b..8521db8768eecb654e5c797f246b49c3b4f27ec2 100644 (file)
--- a/mm/cma.c
+++ b/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_contiguous_nid(phys_addr_t *basep,
        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_contiguous_nid(phys_addr_t *basep,
 
        /* 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;