[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
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |