[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 1/5] xen/arm: Generalize memory hole finding at the final stage


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Koichiro Den <den@xxxxxxxxxxxxx>
  • Date: Sat, 5 Jul 2025 23:26:59 +0900
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=s1PiVzkg44nLFpp1ep5SdZL9TIGP7LHw7KR9TS/PFkA=; b=rSud1m9t/vFDSmg8aVBWILKUmD7oS19rJvFuqpoCyXPGjmRLaAIqXRomGCvxXXXtCw3bPWVNYfr0fqNfc/yqvkv3KXV0uFmvY6SRi7zTdcYrJk6Y1PyeYpQDZvcwCKcyvCEnzwlLakXqR4hhBGjqTukiWBuyFtTvcvNLzU1xAVCVTN4wpYt9PcDgst8tlbebSJWFdTfgeEVhx3Ild6K2ZcmISQGtwICqyllMAO7OIK9qgSihszUysA0uNV/7g46J9kvTZSHdEeh3FhoJaK78z9RdCFB7EYL1Y0h0NKRom7NPY/OWJttha+uAYNOGY66x1F/kvu8zsXMRAS2FYkzUyQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ShJFu1gmZKFXRQt3r32vln26i09dWxNqd5H4wZEJfeRIqu9YEQhQ5DMgDPD5lAzNIIZ3ZUalur9oqVRkgkFpQV0SBGOfZV24rZveaOWFA1uSdj9gc4GpUqdjcT479gfFcE51X7vv0f6HL0nCg57SE/CD00r2xx3d4IsWObWMnHDKYMaJPrQJH5cf8Uhp4rBP+VBVseckTfgdBr8DMf/f8BuGeq9qaNkYoW8sy6OAvAVhKJxcQLNaMm1+TWoZZ4InehgKTbUGOk1SX28uVjOtKHMdjyN0EGTHkuYzaAtBAJZTCKfBJsQd5NK9Xh/ITi2qMQyGN2ZCKyujZ3OVsNgzsw==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp;
  • Cc: Koichiro Den <den@xxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Sat, 05 Jul 2025 14:27:44 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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 <den@xxxxxxxxxxxxx>
---
 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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.