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@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
© 2016 - 2025 Red Hat, Inc.