[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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.