|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 05/13] xen/arm: allocate shared memory from heap when host address not provided
when host address is not provided in "xen,shared-mem", we let Xen
allocate requested shared memory from heap, and once the shared memory is
allocated, it will be marked as static(PGC_static), which means that it will be
reserved as static memory, and will not go back to heap even on freeing.
Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
---
xen/arch/arm/domain_build.c | 83 ++++++++++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index fbb196d8a4..3de96882a5 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -835,6 +835,72 @@ static bool __init is_shm_allocated_to_domio(struct
shm_membank *shm_membank)
return true;
}
+static int __init mark_shared_memory_static(struct shm_membank *shm_membank)
+{
+ unsigned int bank;
+ unsigned long i, nr_mfns;
+ struct page_info *pg;
+ struct meminfo *meminfo;
+
+ BUG_ON(!shm_membank->mem.banks.meminfo);
+ meminfo = shm_membank->mem.banks.meminfo;
+ for ( bank = 0; bank < meminfo->nr_banks; bank++ )
+ {
+ pg = mfn_to_page(maddr_to_mfn(meminfo->bank[bank].start));
+ nr_mfns = PFN_DOWN(meminfo->bank[bank].size);
+
+ for ( i = 0; i < nr_mfns; i++ )
+ {
+ /* The page should be already allocated from heap. */
+ if ( !pg[i].count_info & PGC_state_inuse )
+ {
+ printk(XENLOG_ERR
+ "pg[%lu] MFN %"PRI_mfn" c=%#lx\n",
+ i, mfn_x(page_to_mfn(pg)) + i, pg[i].count_info);
+ goto fail;
+ }
+
+ pg[i].count_info |= PGC_static;
+ }
+ }
+
+ return 0;
+
+ fail:
+ while ( bank >= 0 )
+ {
+ while ( --i >= 0 )
+ pg[i].count_info &= ~PGC_static;
+ i = PFN_DOWN(meminfo->bank[--bank].size);
+ }
+
+ return -EINVAL;
+}
+
+static int __init allocate_shared_memory(struct shm_membank *shm_membank,
+ paddr_t psize)
+{
+ struct meminfo *banks;
+ int ret;
+
+ BUG_ON(shm_membank->mem.banks.meminfo != NULL);
+
+ banks = xmalloc_bytes(sizeof(struct meminfo));
+ if ( banks == NULL )
+ return -ENOMEM;
+ shm_membank->mem.banks.meminfo = banks;
+ memset(shm_membank->mem.banks.meminfo, 0, sizeof(struct meminfo));
+
+ if ( !allocate_domheap_memory(NULL, psize, shm_membank->mem.banks.meminfo)
)
+ return -EINVAL;
+
+ ret = mark_shared_memory_static(shm_membank);
+ if ( ret )
+ return ret;
+
+ return 0;
+}
+
static mfn_t __init acquire_shared_memory_bank(struct domain *d,
paddr_t pbase, paddr_t psize)
{
@@ -975,7 +1041,7 @@ static int __init process_shm(struct domain *d, struct
kernel_info *kinfo,
unsigned int i;
const char *role_str;
const char *shm_id;
- bool owner_dom_io = true;
+ bool owner_dom_io = true, paddr_assigned = true;
struct shm_membank *shm_membank;
if ( !dt_device_is_compatible(shm_node, "xen,domain-shared-memory-v1")
)
@@ -1035,6 +1101,21 @@ static int __init process_shm(struct domain *d, struct
kernel_info *kinfo,
return -ENOENT;
}
+ /*
+ * When host address is not provided in "xen,shared-mem",
+ * we let Xen allocate requested memory from heap at first domain.
+ */
+ if ( !paddr_assigned && !shm_membank->mem.banks.meminfo )
+ {
+ ret = allocate_shared_memory(shm_membank, psize);
+ if ( ret )
+ {
+ printk("%pd: failed to allocate shared memory
bank(%"PRIpaddr"MB) from heap: %d\n",
+ d, psize >> 20, ret);
+ return ret;
+ }
+ }
+
/*
* 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
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |