[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 06/13] xen/arm: set up shared memory foreign mapping for borrower domain
From: Penny Zheng <penny.zheng@xxxxxxx> This commits introduces a new helper guest_physmap_add_shm to set up shared memory foreign mapping for borrower domain. Firstly it should get and take reference of statically shared pages from owner dom_shared. Then it will setup P2M foreign memory map of these statically shared pages for borrower domain. This commits only considers owner domain is the default dom_shared, the other scenario will be covered in the following patches. Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx> --- xen/arch/arm/domain_build.c | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 984e70e5fc..8cee5ffbd1 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -798,6 +798,48 @@ static int __init allocate_shared_memory(struct domain *d, return ret; } +static int __init guest_physmap_add_shm(struct domain *od, struct domain *bd, + unsigned long o_gfn, + unsigned long b_gfn, + unsigned long nr_gfns) +{ + struct page_info **pages = NULL; + p2m_type_t p2mt, t; + int ret = 0; + + pages = xmalloc_array(struct page_info *, nr_gfns); + if ( !pages ) + return -ENOMEM; + + /* + * Take reference of statically shared pages from owner domain. + * Reference will be released when destroying shared memory region. + */ + ret = get_pages_from_gfn(od, o_gfn, nr_gfns, pages, &p2mt, P2M_ALLOC); + if ( ret ) + { + ret = -EINVAL; + goto fail_pages; + } + + if ( p2m_is_ram(p2mt) ) + t = (p2mt == p2m_ram_rw) ? p2m_map_foreign_rw : p2m_map_foreign_ro; + else + { + ret = -EINVAL; + goto fail_pages; + } + + /* Set up guest foreign map. */ + ret = guest_physmap_add_pages(bd, _gfn(b_gfn), page_to_mfn(pages[0]), + nr_gfns, t); + + fail_pages: + xfree(pages); + + return ret; +} + static int __init process_shm(struct domain *d, const struct dt_device_node *node) { @@ -855,6 +897,16 @@ static int __init process_shm(struct domain *d, set_bit(shm_id, shm_mask); } + + /* + * All domains are borrower domains when owner domain is the + * default dom_shared, so here we could just set up P2M foreign + * mapping for borrower domain immediately. + */ + ret = guest_physmap_add_shm(dom_shared, d, PFN_DOWN(pbase), + PFN_DOWN(gbase), PFN_DOWN(psize)); + if ( ret ) + return ret; } return 0; -- 2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |