|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 02/13] xen/arm: switch to use shm_membank as function parameter
Hello,
Reading this patch, I found one place that can be improved.
On 11/15/22 03:52, Penny Zheng wrote:
> Instead of using multiple function parameters to deliver various shm-related
> info, like host physical address, SHMID, etc, and with the introduction
> of new struct "shm_membank", we could switch to use "shm_membank" as
> function parameter to replace them all, to make codes more clear and
> tidy.
>
> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> ---
> xen/arch/arm/domain_build.c | 46 ++++++++++++++++++-------------------
> 1 file changed, 23 insertions(+), 23 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index c0fd13f6ed..d2b9e60b5c 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -751,40 +751,31 @@ static void __init assign_static_memory_11(struct
> domain *d,
> }
>
> #ifdef CONFIG_STATIC_SHM
> -static int __init acquire_nr_borrower_domain(struct domain *d,
> - paddr_t pbase, paddr_t psize,
> - unsigned long *nr_borrowers)
> +static struct shm_membank * __init acquire_shm_membank(const char *shm_id)
> {
> unsigned int bank;
>
> /* Iterate static shared memory to find requested shm bank. */
> for ( bank = 0 ; bank < bootinfo.shm_mem.nr_banks; bank++ )
> - {
> - paddr_t bank_start = bootinfo.shm_mem.bank[bank].membank->start;
> - paddr_t bank_size = bootinfo.shm_mem.bank[bank].membank->size;
> -
> - if ( (pbase == bank_start) && (psize == bank_size) )
> + if ( strcmp(shm_id, bootinfo.shm_mem.bank[bank].shm_id) == 0 )
The target shared memory is found and the bank can be returned
directly here (return &bootinfo.shm_mem.bank[bank];).
Therefore, the out-of-bounds condition check can be removed below.
> break;
> - }
>
> if ( bank == bootinfo.shm_mem.nr_banks )
This can be removed, but only return NULL because the target memory is
not found.
> - return -ENOENT;
> -
> - *nr_borrowers = bootinfo.shm_mem.bank[bank].nr_shm_borrowers;
> + return NULL;
>
> - return 0;
> + return &bootinfo.shm_mem.bank[bank];
> }
>
> /*
> * This function checks whether the static shared memory region is
> * already allocated to dom_io.
> */
> -static bool __init is_shm_allocated_to_domio(paddr_t pbase)
> +static bool __init is_shm_allocated_to_domio(struct shm_membank *shm_membank)
> {
> struct page_info *page;
> struct domain *d;
>
> - page = maddr_to_page(pbase);
> + page = maddr_to_page(shm_membank->membank->start);
> d = page_get_owner_and_reference(page);
> if ( d == NULL )
> return false;
> @@ -835,14 +826,17 @@ static mfn_t __init acquire_shared_memory_bank(struct
> domain *d,
> }
>
> static int __init assign_shared_memory(struct domain *d,
> - uint32_t addr_cells, uint32_t
> size_cells,
> - paddr_t pbase, paddr_t psize,
> + struct shm_membank *shm_membank,
> paddr_t gbase)
> {
> mfn_t smfn;
> int ret = 0;
> unsigned long nr_pages, nr_borrowers, i;
> struct page_info *page;
> + paddr_t pbase, psize;
> +
> + pbase = shm_membank->membank->start;
> + psize = shm_membank->membank->size;
>
> printk("%pd: allocate static shared memory BANK
> %#"PRIpaddr"-%#"PRIpaddr".\n",
> d, pbase, pbase + psize);
> @@ -871,9 +865,7 @@ static int __init assign_shared_memory(struct domain *d,
> * Get the right amount of references per page, which is the number of
> * borrower domains.
> */
> - ret = acquire_nr_borrower_domain(d, pbase, psize, &nr_borrowers);
> - if ( ret )
> - return ret;
> + nr_borrowers = shm_membank->nr_shm_borrowers;
>
> /*
> * Instead of letting borrower domain get a page ref, we add as many
> @@ -941,6 +933,7 @@ static int __init process_shm(struct domain *d, struct
> kernel_info *kinfo,
> const char *role_str;
> const char *shm_id;
> bool owner_dom_io = true;
> + struct shm_membank *shm_membank;
>
> if ( !dt_device_is_compatible(shm_node,
> "xen,domain-shared-memory-v1") )
> continue;
> @@ -991,12 +984,20 @@ static int __init process_shm(struct domain *d, struct
> kernel_info *kinfo,
> }
> BUG_ON((strlen(shm_id) <= 0) || (strlen(shm_id) >=
> MAX_SHM_ID_LENGTH));
>
> + shm_membank = acquire_shm_membank(shm_id);
> + if ( !shm_membank )
> + {
> + printk("%pd: failed to acquire %s shared memory bank\n",
> + d, shm_id);
> + return -ENOENT;
> + }
> +
> /*
> * DOMID_IO is a fake domain and is not described in the
> Device-Tree.
> * Therefore when the owner of the shared region is DOMID_IO, we
> will
> * only find the borrowers.
> */
> - if ( (owner_dom_io && !is_shm_allocated_to_domio(pbase)) ||
> + if ( (owner_dom_io && !is_shm_allocated_to_domio(shm_membank)) ||
> (!owner_dom_io && strcmp(role_str, "owner") == 0) )
> {
> /*
> @@ -1004,8 +1005,7 @@ static int __init process_shm(struct domain *d, struct
> kernel_info *kinfo,
> * specified, so they should be assigned to dom_io.
> */
> ret = assign_shared_memory(owner_dom_io ? dom_io : d,
> - addr_cells, size_cells,
> - pbase, psize, gbase);
> + shm_membank, gbase);
> if ( ret )
> return ret;
> }
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |