|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 3/9] xen/arm: allocate static shared memory to a specific owner domain
On Tue, 6 Sep 2022, Penny Zheng wrote:
> If owner property is defined, then owner domain of a static shared memory
> region is not the default dom_io anymore, but a specific domain.
>
> This commit implements allocating static shared memory to a specific domain
> when owner property is defined.
>
> Coding flow for dealing borrower domain will be introduced later in the
> following commits.
>
> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> v7 chhanges:
> - adapt to the previous commits' changes
> ---
> v6 change:
> - fix coding-style
> - role_str and owner_dom_io shall be defined within the loop
> ---
> v5 change:
> - no change
> ---
> v4 change:
> - no changes
> ---
> v3 change:
> - simplify the code since o_gbase is not used if the domain is dom_io
> ---
> v2 change:
> - P2M mapping is restricted to normal domain
> - in-code comment fix
> ---
> xen/arch/arm/domain_build.c | 36 +++++++++++++++++++++++++++++-------
> 1 file changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index be98ff83b1..4be8a00171 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -822,9 +822,11 @@ 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)
> + paddr_t pbase, paddr_t psize,
> + paddr_t gbase)
> {
> mfn_t smfn;
> + int ret = 0;
>
> dprintk(XENLOG_INFO,
> "%pd: allocate static shared memory BANK
> %#"PRIpaddr"-%#"PRIpaddr".\n",
> @@ -838,8 +840,18 @@ static int __init assign_shared_memory(struct domain *d,
> * DOMID_IO is auto-translated (i.e. it seems RAM 1:1). So we do not need
> * to create mapping in the P2M.
> */
> - ASSERT(d == dom_io);
> - return 0;
> + if ( d != dom_io )
> + {
> + ret = guest_physmap_add_pages(d, gaddr_to_gfn(gbase), smfn,
> + PFN_DOWN(psize));
> + if ( ret )
> + {
> + printk(XENLOG_ERR "Failed to map shared memory to %pd.\n", d);
> + return ret;
> + }
> + }
> +
> + return ret;
> }
>
> static int __init process_shm(struct domain *d,
> @@ -855,6 +867,8 @@ static int __init process_shm(struct domain *d,
> paddr_t gbase, pbase, psize;
> int ret = 0;
> unsigned int i;
> + const char *role_str;
> + bool owner_dom_io = true;
>
> if ( !dt_device_is_compatible(shm_node,
> "xen,domain-shared-memory-v1") )
> continue;
> @@ -891,20 +905,28 @@ static int __init process_shm(struct domain *d,
> return -EINVAL;
> }
>
> - /* TODO: Consider owner domain is not the default dom_io. */
> + /*
> + * "role" property is optional and if it is defined explicitly,
> + * then the owner domain is not the default "dom_io" domain.
> + */
> + if ( dt_property_read_string(shm_node, "role", &role_str) == 0 )
> + owner_dom_io = false;
> +
> /*
> * 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 ( !is_shm_allocated_to_domio(pbase) )
> + if ( (owner_dom_io && !is_shm_allocated_to_domio(pbase)) ||
> + (!owner_dom_io && strcmp(role_str, "owner") == 0) )
> {
> /*
> * We found the first borrower of the region, the owner was not
> * specified, so they should be assigned to dom_io.
> */
> - ret = assign_shared_memory(dom_io, addr_cells, size_cells,
> - pbase, psize);
> + ret = assign_shared_memory(owner_dom_io ? dom_io : d,
> + addr_cells, size_cells,
> + pbase, psize, gbase);
> if ( ret )
> return ret;
> }
> --
> 2.25.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |