[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/6] xen/arm: switch find_domU_holes to rangesets
On Sun, 4 May 2025, Stewart Hildebrand wrote: > 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> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > 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 |