[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 11/11] xen/arm: List static shared memory regions as /memory nodes



Currently Xen is not exporting the static shared memory regions
to the device tree as /memory node, this commit is fixing this
issue.

Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
---
 xen/arch/arm/dom0less-build.c           |  5 +++
 xen/arch/arm/domain_build.c             |  7 +++-
 xen/arch/arm/include/asm/static-shmem.h |  5 ++-
 xen/arch/arm/static-shmem.c             | 54 +++++++++++++++----------
 4 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
index fe2a771d4984..0892020f21a0 100644
--- a/xen/arch/arm/dom0less-build.c
+++ b/xen/arch/arm/dom0less-build.c
@@ -647,6 +647,11 @@ static int __init prepare_dtb_domU(struct domain *d, 
struct kernel_info *kinfo)
     if ( ret )
         goto err;
 
+    /* List static shared memory regions as /memory@<address> nodes */
+    ret = make_shm_memory_node(d, kinfo, addrcells, sizecells, false);
+    if ( ret )
+        return ret;
+
     ret = make_resv_memory_node(d, kinfo, addrcells, sizecells);
     if ( ret )
         goto err;
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 575e906d81a6..bd7716cd5829 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1723,7 +1723,7 @@ static int __init handle_node(struct domain *d, struct 
kernel_info *kinfo,
          * static shared memory nodes there.
          */
         res = make_shm_memory_node(d, kinfo, dt_n_addr_cells(node),
-                                   dt_n_size_cells(node));
+                                   dt_n_size_cells(node), true);
         if ( res )
             return res;
     }
@@ -1780,6 +1780,11 @@ static int __init handle_node(struct domain *d, struct 
kernel_info *kinfo,
                 return res;
         }
 
+        /* List static shared memory regions as /memory@<address> nodes */
+        res = make_shm_memory_node(d, kinfo, addrcells, sizecells, false);
+        if ( res )
+            return res;
+
         if ( !res_mem_node_found )
         {
             res = make_resv_memory_node(d, kinfo, addrcells, sizecells);
diff --git a/xen/arch/arm/include/asm/static-shmem.h 
b/xen/arch/arm/include/asm/static-shmem.h
index d28b9540d49b..c118bbb1c43b 100644
--- a/xen/arch/arm/include/asm/static-shmem.h
+++ b/xen/arch/arm/include/asm/static-shmem.h
@@ -37,7 +37,7 @@ int remove_shm_holes_for_domU(const struct kernel_info *kinfo,
 
 int make_shm_memory_node(const struct domain *d,
                          const struct kernel_info *kinfo, int addrcells,
-                         int sizecells);
+                         int sizecells, bool is_resv_mem_node);
 
 #else /* !CONFIG_STATIC_SHM */
 
@@ -85,7 +85,8 @@ static inline int remove_shm_holes_for_domU(const struct 
kernel_info *kinfo,
 
 static inline int make_shm_memory_node(const struct domain *d,
                                        const struct kernel_info *kinfo,
-                                       int addrcells, int sizecells)
+                                       int addrcells, int sizecells,
+                                       bool is_resv_mem_node)
 {
     return 0;
 }
diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
index 67d5fa3b5d25..cdaf4485c934 100644
--- a/xen/arch/arm/static-shmem.c
+++ b/xen/arch/arm/static-shmem.c
@@ -289,7 +289,7 @@ int __init process_shm(struct domain *d, struct kernel_info 
*kinfo,
 
 int __init make_shm_memory_node(const struct domain *d,
                                 const struct kernel_info *kinfo, int addrcells,
-                                int sizecells)
+                                int sizecells, bool is_resv_mem_node)
 {
     const struct membanks *mem = &kinfo->shm_mem.common;
     void *fdt = kinfo->fdt;
@@ -300,11 +300,15 @@ int __init make_shm_memory_node(const struct domain *d,
         return 0;
 
     /*
-     * For each shared memory region, a range is exposed under
-     * the /reserved-memory node as a child node. Each range sub-node is
-     * named xen-shmem@<address>.
+     * When is_resv_mem_node is true, it means this function is called to
+     * create nodes under /reserved-memory, so for each shared memory region, a
+     * range is exposed under the /reserved-memory node as a child node. Each
+     * range sub-node is named xen-shmem@<address>.
+     * Otherwise the function is called under / and will create
+     * /memory@<address> nodes for each static shared memory region.
      */
-    dt_dprintk("Create xen-shmem node\n");
+    dt_dprintk("Create static shared memory %s nodes\n",
+               is_resv_mem_node ? "/reserved-memory/xen-shmem" : "/memory");
 
     for ( ; i < mem->nr_banks; i++ )
     {
@@ -316,11 +320,16 @@ int __init make_shm_memory_node(const struct domain *d,
         __be32 *cells;
         unsigned int len = (addrcells + sizecells) * sizeof(__be32);
 
-        res = domain_fdt_begin_node(fdt, "xen-shmem", mem->bank[i].start);
+        res = domain_fdt_begin_node(fdt,
+                                    is_resv_mem_node ? "xen-shmem" : "memory",
+                                    mem->bank[i].start);
         if ( res )
             return res;
 
-        res = fdt_property(fdt, "compatible", compat, sizeof(compat));
+        if ( is_resv_mem_node )
+            res = fdt_property(fdt, "compatible", compat, sizeof(compat));
+        else
+            res = fdt_property_string(fdt, "device_type", "memory");
         if ( res )
             return res;
 
@@ -334,20 +343,23 @@ int __init make_shm_memory_node(const struct domain *d,
         dt_dprintk("Shared memory bank %u: %#"PRIx64"->%#"PRIx64"\n",
                    i, start, start + size);
 
-        res = fdt_property_string(fdt, "xen,id",
-                                  mem->bank[i].shmem_extra->shm_id);
-        if ( res )
-            return res;
+        if ( is_resv_mem_node )
+        {
+            res = fdt_property_string(fdt, "xen,id",
+                                      mem->bank[i].shmem_extra->shm_id);
+            if ( res )
+                return res;
 
-        /*
-         * TODO:
-         * - xen,offset: (borrower VMs only)
-         *   64 bit integer offset within the owner virtual machine's shared
-         *   memory region used for the mapping in the borrower VM
-         */
-        res = fdt_property_u64(fdt, "xen,offset", 0);
-        if ( res )
-            return res;
+            /*
+            * TODO:
+            * - xen,offset: (borrower VMs only)
+            *   64 bit integer offset within the owner virtual machine's shared
+            *   memory region used for the mapping in the borrower VM
+            */
+            res = fdt_property_u64(fdt, "xen,offset", 0);
+            if ( res )
+                return res;
+        }
 
         res = fdt_end_node(fdt);
         if ( res )
@@ -536,7 +548,7 @@ int __init make_resv_memory_node(const struct domain *d,
     if ( res )
         return res;
 
-    res = make_shm_memory_node(d, kinfo, addrcells, sizecells);
+    res = make_shm_memory_node(d, kinfo, addrcells, sizecells, true);
     if ( res )
         return res;
 
-- 
2.34.1




 


Rackspace

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