|
[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 |