|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 3/8] xen/arm: allocate static shared memory to a specific owner domain
On Thu, 12 May 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>
> ---
> 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 | 44 +++++++++++++++++++++++++++----------
> 1 file changed, 33 insertions(+), 11 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 5b41ec57f0..9c53b9fa7b 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -797,9 +797,11 @@ static mfn_t __init acquire_shared_memory_bank(struct
> domain *d,
> */
> static int __init allocate_shared_memory(struct domain *d,
> u32 addr_cells, u32 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,
> "Allocate static shared memory BANK
> %#"PRIpaddr"-%#"PRIpaddr".\n",
> @@ -814,8 +816,18 @@ static int __init allocate_shared_memory(struct domain
> *d,
> * DOMID_IO is the domain, like DOMID_XEN, that is not auto-translated.
> * It sees RAM 1:1 and we do not need to create P2M mapping for it
> */
> - 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,
> @@ -828,6 +840,8 @@ static int __init process_shm(struct domain *d,
> u32 shm_id;
> u32 addr_cells, size_cells;
> paddr_t gbase, pbase, psize;
> + const char *role_str;
> + bool owner_dom_io = true;
>
> dt_for_each_child_node(node, shm_node)
> {
> @@ -854,19 +868,27 @@ static int __init process_shm(struct domain *d,
> ASSERT(IS_ALIGNED(pbase, PAGE_SIZE) && IS_ALIGNED(psize, PAGE_SIZE));
> gbase = dt_read_number(cells, addr_cells);
>
> - /* 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;
> +
> /*
> * Per static shared memory region could be shared between multiple
> * domains.
> - * In case re-allocating the same shared memory region, we check
> - * if it is already allocated to the default owner dom_io before
> - * the actual allocation.
> + * So when owner domain is the default dom_io, in case re-allocating
> + * the same shared memory region, we check if it is already allocated
> + * to the default owner dom_io before the actual allocation.
> */
> - 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) )
> {
> - /* Allocate statically shared pages to the default owner dom_io.
> */
> - ret = allocate_shared_memory(dom_io, addr_cells, size_cells,
> - pbase, psize);
> + /* Allocate statically shared pages to the owner domain. */
> + ret = allocate_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 |