|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 10/13] xen/arm: allocate static shared memory to a specific owner domain
From: Penny Zheng <penny.zheng@xxxxxxx>
If owner property is defined, then owner domain of a static shared memory
region is not the default dom_shared anymore, but a specific domain.
This commit implements allocating static shared memory to a specific domain
when owner property is defined.
Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
---
xen/arch/arm/domain_build.c | 63 ++++++++++++++++++++++++++++---------
1 file changed, 48 insertions(+), 15 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index d35f98ff9c..7ee4d33e0b 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -872,6 +872,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_shared = true;
dt_for_each_child_node(node, shm_node)
{
@@ -899,6 +901,13 @@ static int __init process_shm(struct domain *d,
gbase = dt_read_number(cells, addr_cells);
/* TODO: Consider owner domain is not the default dom_shared. */
+ /*
+ * "role" property is optional and if it is defined explicitly,
+ * so the owner domain is not the default "dom_shared" domain.
+ */
+ if ( dt_property_read_string(shm_node, "role", &role_str) == 0 )
+ owner_dom_shared = false;
+
/*
* Per shared memory region could be shared between multiple domains.
* In case re-allocating the same shared memory region, we use bitmask
@@ -907,17 +916,38 @@ static int __init process_shm(struct domain *d,
*/
if ( !test_bit(shm_id, shm_mask) )
{
- /*
- * Allocate statically shared pages to the default dom_shared.
- * Set up P2M, and dom_shared is a direct-map domain,
- * so GFN == PFN.
- */
- ret = allocate_shared_memory(dom_shared, addr_cells, size_cells,
- pbase, psize, pbase);
- if ( ret )
- return ret;
-
- set_bit(shm_id, shm_mask);
+ if ( !owner_dom_shared )
+ {
+ if ( strcmp(role_str, "owner") == 0 )
+ {
+ /*
+ * Allocate statically shared pages to a specific owner
+ * domain.
+ */
+ ret = allocate_shared_memory(d, shm_id, addr_cells,
+ size_cells, pbase, psize,
+ gbase);
+ if ( ret )
+ return ret;
+
+ set_bit(shm_id, shm_mask);
+ }
+ }
+ else
+ {
+ /*
+ * Allocate statically shared pages to the default dom_shared.
+ * Set up P2M, and dom_shared is a direct-map domain,
+ * so GFN == PFN.
+ */
+ ret = allocate_shared_memory(dom_shared, shm_id,
+ addr_cells, size_cells, pbase,
+ psize, pbase);
+ if ( ret )
+ return ret;
+
+ set_bit(shm_id, shm_mask);
+ }
}
/*
@@ -925,10 +955,13 @@ static int __init process_shm(struct domain *d,
* 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;
+ if ( owner_dom_shared )
+ {
+ ret = guest_physmap_add_shm(dom_shared, d, PFN_DOWN(pbase),
+ PFN_DOWN(gbase), PFN_DOWN(psize));
+ if ( ret )
+ return ret;
+ }
/*
* Record static shared memory region info for later setting
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |