[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/6] xen/arm: switch find_domU_holes to rangesets
remove_shm_holes_for_domU() is unnecessarily complex: it re-creates the extended regions from scratch. Move the rangeset into find_domU_holes() and create the extended regions only once. This makes is simpler to further manipulate the rangeset for removing other regions. Remove now-unused remove_shm_holes_for_domU(). Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> --- xen/arch/arm/domain_build.c | 46 ++++++++++++----- xen/arch/arm/include/asm/static-shmem.h | 9 ---- xen/arch/arm/static-shmem.c | 65 ------------------------- 3 files changed, 35 insertions(+), 85 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index a0f3c074337d..3dcdd7a8c46f 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1256,34 +1256,58 @@ static int __init find_domU_holes(const struct kernel_info *kinfo, struct membanks *ext_regions) { unsigned int i; - uint64_t bankend; const uint64_t bankbase[] = GUEST_RAM_BANK_BASES; const uint64_t banksize[] = GUEST_RAM_BANK_SIZES; const struct membanks *kinfo_mem = kernel_info_get_mem_const(kinfo); - int res = -ENOENT; + struct rangeset *mem_holes; + int res; + + mem_holes = rangeset_new(NULL, NULL, 0); + if ( !mem_holes ) + return -ENOMEM; for ( i = 0; i < GUEST_RAM_BANKS; i++ ) { - struct membank *ext_bank = &(ext_regions->bank[ext_regions->nr_banks]); + uint64_t bankend, start, size = 0; - ext_bank->start = ROUNDUP(bankbase[i] + kinfo_mem->bank[i].size, SZ_2M); + start = ROUNDUP(bankbase[i] + kinfo_mem->bank[i].size, SZ_2M); bankend = ~0ULL >> (64 - p2m_ipa_bits); bankend = min(bankend, bankbase[i] + banksize[i] - 1); - if ( bankend > ext_bank->start ) - ext_bank->size = bankend - ext_bank->start + 1; + + if ( bankend > start ) + size = bankend - start + 1; /* 64MB is the minimum size of an extended region */ - if ( ext_bank->size < MB(64) ) + if ( size < MB(64) ) continue; - ext_regions->nr_banks++; - res = 0; + + res = rangeset_add_range(mem_holes, PFN_DOWN(start), PFN_DOWN(bankend)); + if ( res ) + { + printk(XENLOG_ERR "Failed to add: %#"PRIx64"->%#"PRIx64"\n", + start, start + size - 1); + goto out; + } } + /* Remove static shared memory regions */ + res = remove_shm_from_rangeset(kinfo, mem_holes); if ( res ) - return res; + goto out; + + res = rangeset_report_ranges(mem_holes, 0, + PFN_DOWN((1ULL << p2m_ipa_bits) - 1), + add_ext_regions, ext_regions); + if ( res ) + ext_regions->nr_banks = 0; + else if ( !ext_regions->nr_banks ) + res = -ENOENT; - return remove_shm_holes_for_domU(kinfo, ext_regions); + out: + rangeset_destroy(mem_holes); + + return res; } static int __init find_host_extended_regions(const struct kernel_info *kinfo, diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index 94eaa9d500f9..ad8267c6bfbe 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -28,9 +28,6 @@ void init_sharedmem_pages(void); int remove_shm_from_rangeset(const struct kernel_info *kinfo, struct rangeset *rangeset); -int remove_shm_holes_for_domU(const struct kernel_info *kinfo, - struct membanks *ext_regions); - int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells, int sizecells); @@ -74,12 +71,6 @@ static inline int remove_shm_from_rangeset(const struct kernel_info *kinfo, return 0; } -static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo, - struct membanks *ext_regions) -{ - return 0; -} - static inline int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells, int sizecells) { diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index e8d4ca3ba3ff..06f32be097c8 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -820,71 +820,6 @@ int __init remove_shm_from_rangeset(const struct kernel_info *kinfo, return 0; } -int __init remove_shm_holes_for_domU(const struct kernel_info *kinfo, - struct membanks *ext_regions) -{ - const struct membanks *shm_mem = kernel_info_get_shm_mem_const(kinfo); - struct rangeset *guest_holes; - unsigned int i; - paddr_t start; - paddr_t end; - int res; - - /* No static shared memory region. */ - if ( shm_mem->nr_banks == 0 ) - return 0; - - dt_dprintk("Remove static shared memory holes from extended regions of DomU\n"); - - guest_holes = rangeset_new(NULL, NULL, 0); - if ( !guest_holes ) - return -ENOMEM; - - /* Copy extended regions sets into the rangeset */ - for ( i = 0; i < ext_regions->nr_banks; i++ ) - { - start = ext_regions->bank[i].start; - end = start + ext_regions->bank[i].size; - - res = rangeset_add_range(guest_holes, PFN_DOWN(start), - PFN_DOWN(end - 1)); - if ( res ) - { - printk(XENLOG_ERR - "Failed to add: %#"PRIpaddr"->%#"PRIpaddr", error: %d\n", - start, end, res); - goto out; - } - } - - /* Remove static shared memory regions */ - res = remove_shm_from_rangeset(kinfo, guest_holes); - if ( res ) - goto out; - - /* - * Take the interval of memory starting from the first extended region bank - * start address and ending to the end of the last extended region bank. - */ - i = ext_regions->nr_banks - 1; - start = ext_regions->bank[0].start; - end = ext_regions->bank[i].start + ext_regions->bank[i].size - 1; - - /* Reset original extended regions to hold new value */ - ext_regions->nr_banks = 0; - res = rangeset_report_ranges(guest_holes, PFN_DOWN(start), PFN_DOWN(end), - add_ext_regions, ext_regions); - if ( res ) - ext_regions->nr_banks = 0; - else if ( !ext_regions->nr_banks ) - res = -ENOENT; - - out: - rangeset_destroy(guest_holes); - - return res; -} - void __init shm_mem_node_fill_reg_range(const struct kernel_info *kinfo, __be32 *reg, int *nr_cells, int addrcells, int sizecells) -- 2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |