Make the three kinds of logic reusable beyond just extended regions by
introducing add_regions_cb parameter and factoring out the extended
region-specific names and logics outside of the three functions.
Specifically in find_domU_holes(), 64MB size checking for an extended
region is deferred to the existing add_ext_region(). Also, introduce a
wrapper function 'find_unused_regions', that can be used to find memory
holes at the final stage of domain creation.

No functional change.

Signed-off-by: Koichiro Den <d...@valinux.co.jp>
---
 xen/arch/arm/domain_build.c | 62 +++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 4ff161887ec3..42210c702ab8 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -40,6 +40,9 @@
 #include <asm/grant_table.h>
 #include <xen/serial.h>
 
+typedef int (*add_regions_cb)(unsigned long s_gfn, unsigned long e_gfn,
+                              void *data);
+
 static unsigned int __initdata opt_dom0_max_vcpus;
 integer_param("dom0_max_vcpus", opt_dom0_max_vcpus);
 
@@ -805,7 +808,8 @@ static int __init handle_pci_range(const struct 
dt_device_node *dev,
  * - xen,reg mappings
  */
 static int __init find_memory_holes(const struct kernel_info *kinfo,
-                                    struct membanks *ext_regions)
+                                    struct membanks *unused_regions,
+                                    add_regions_cb cb)
 {
     struct dt_device_node *np;
     struct rangeset *mem_holes;
@@ -813,7 +817,7 @@ static int __init find_memory_holes(const struct 
kernel_info *kinfo,
     unsigned int i;
     int res;
 
-    dt_dprintk("Find memory holes for extended regions\n");
+    dt_dprintk("Find memory holes\n");
 
     mem_holes = rangeset_new(NULL, NULL, 0);
     if ( !mem_holes )
@@ -894,10 +898,10 @@ static int __init find_memory_holes(const struct 
kernel_info *kinfo,
     start = 0;
     end = (1ULL << p2m_ipa_bits) - 1;
     res = rangeset_report_ranges(mem_holes, PFN_DOWN(start), PFN_DOWN(end),
-                                 add_ext_regions,  ext_regions);
+                                 cb, unused_regions);
     if ( res )
-        ext_regions->nr_banks = 0;
-    else if ( !ext_regions->nr_banks )
+        unused_regions->nr_banks = 0;
+    else if ( !unused_regions->nr_banks )
         res = -ENOENT;
 
 out:
@@ -907,7 +911,8 @@ out:
 }
 
 static int __init find_domU_holes(const struct kernel_info *kinfo,
-                                  struct membanks *ext_regions)
+                                  struct membanks *unused_regions,
+                                  add_regions_cb cb)
 {
     unsigned int i;
     const uint64_t bankbase[] = GUEST_RAM_BANK_BASES;
@@ -932,8 +937,7 @@ static int __init find_domU_holes(const struct kernel_info 
*kinfo,
         if ( bankend > start )
             size = bankend - start + 1;
 
-        /* 64MB is the minimum size of an extended region */
-        if ( size < MB(64) )
+        if ( size < SZ_4K )
             continue;
 
         res = rangeset_add_range(mem_holes, PFN_DOWN(start), 
PFN_DOWN(bankend));
@@ -959,10 +963,10 @@ static int __init find_domU_holes(const struct 
kernel_info *kinfo,
 
     res = rangeset_report_ranges(mem_holes, 0,
                                  PFN_DOWN((1ULL << p2m_ipa_bits) - 1),
-                                 add_ext_regions, ext_regions);
+                                 cb, unused_regions);
     if ( res )
-        ext_regions->nr_banks = 0;
-    else if ( !ext_regions->nr_banks )
+        unused_regions->nr_banks = 0;
+    else if ( !unused_regions->nr_banks )
         res = -ENOENT;
 
  out:
@@ -1007,8 +1011,9 @@ static int __init rangeset_to_membank(unsigned long 
s_gfn, unsigned long e_gfn,
     return 0;
 }
 
-static int __init find_host_extended_regions(const struct kernel_info *kinfo,
-                                             struct membanks *ext_regions)
+static int __init find_memory_holes_noiommu(const struct kernel_info *kinfo,
+                                            struct membanks *unused_regions,
+                                            add_regions_cb cb)
 {
     int res;
     struct membanks *gnttab = membanks_xzalloc(1, MEMORY);
@@ -1035,7 +1040,7 @@ static int __init find_host_extended_regions(const struct 
kernel_info *kinfo,
         xen_reg,
     };
 
-    dt_dprintk("Find unallocated memory for extended regions\n");
+    dt_dprintk("Find memory holes (noiommu)\n");
 
     if ( !gnttab )
     {
@@ -1061,7 +1066,7 @@ static int __init find_host_extended_regions(const struct 
kernel_info *kinfo,
     gnttab->bank[0].size = kinfo->gnttab_size;
 
     res = find_unallocated_memory(kinfo, mem_banks, ARRAY_SIZE(mem_banks),
-                                  ext_regions, add_ext_regions);
+                                  unused_regions, cb);
 
  out:
     xfree(xen_reg);
@@ -1070,6 +1075,21 @@ static int __init find_host_extended_regions(const 
struct kernel_info *kinfo,
     return res;
 }
 
+static int __init find_unused_regions(const struct kernel_info *kinfo,
+                                      struct membanks *unused_regions,
+                                      add_regions_cb cb)
+{
+    if ( domain_use_host_layout(kinfo->d) )
+    {
+        if ( !is_iommu_enabled(kinfo->d) )
+            return find_memory_holes_noiommu(kinfo, unused_regions, cb);
+        else
+            return find_memory_holes(kinfo, unused_regions, cb);
+    }
+    else
+        return find_domU_holes(kinfo, unused_regions, cb);
+}
+
 int __init make_hypervisor_node(struct domain *d,
                                 const struct kernel_info *kinfo,
                                 int addrcells, int sizecells)
@@ -1121,17 +1141,7 @@ int __init make_hypervisor_node(struct domain *d,
         if ( !ext_regions )
             return -ENOMEM;
 
-        if ( domain_use_host_layout(d) )
-        {
-            if ( !is_iommu_enabled(d) )
-                res = find_host_extended_regions(kinfo, ext_regions);
-            else
-                res = find_memory_holes(kinfo, ext_regions);
-        }
-        else
-        {
-            res = find_domU_holes(kinfo, ext_regions);
-        }
+        res = find_unused_regions(kinfo, ext_regions, add_ext_regions);
 
         if ( res )
             printk(XENLOG_WARNING "%pd: failed to allocate extended regions\n",
-- 
2.48.1


Reply via email to