diff mbox series

[v7,3/9] xen/arm: allocate static shared memory to a specific owner domain

Message ID 20220906085941.944592-4-Penny.Zheng@arm.com (mailing list archive)
State Superseded
Headers show
Series static shared memory on dom0less system | expand

Commit Message

Penny Zheng Sept. 6, 2022, 8:59 a.m. UTC
If owner property is defined, then owner domain of a static shared memory
region is not the default dom_io anymore, but a specific domain.

This commit implements allocating static shared memory to a specific domain
when owner property is defined.

Coding flow for dealing borrower domain will be introduced later in the
following commits.

Signed-off-by: Penny Zheng <penny.zheng@arm.com>
---
v7 chhanges:
- adapt to the previous commits' changes
---
v6 change:
- fix coding-style
- role_str and owner_dom_io shall be defined within the loop
---
v5 change:
- no change
---
v4 change:
- no changes
---
v3 change:
- simplify the code since o_gbase is not used if the domain is dom_io
---
v2 change:
- P2M mapping is restricted to normal domain
- in-code comment fix
---
 xen/arch/arm/domain_build.c | 36 +++++++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 7 deletions(-)

Comments

Stefano Stabellini Sept. 6, 2022, 9:55 p.m. UTC | #1
On Tue, 6 Sep 2022, Penny Zheng wrote:
> If owner property is defined, then owner domain of a static shared memory
> region is not the default dom_io anymore, but a specific domain.
> 
> This commit implements allocating static shared memory to a specific domain
> when owner property is defined.
> 
> Coding flow for dealing borrower domain will be introduced later in the
> following commits.
> 
> Signed-off-by: Penny Zheng <penny.zheng@arm.com>

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
> v7 chhanges:
> - adapt to the previous commits' changes
> ---
> v6 change:
> - fix coding-style
> - role_str and owner_dom_io shall be defined within the loop
> ---
> v5 change:
> - no change
> ---
> v4 change:
> - no changes
> ---
> v3 change:
> - simplify the code since o_gbase is not used if the domain is dom_io
> ---
> v2 change:
> - P2M mapping is restricted to normal domain
> - in-code comment fix
> ---
>  xen/arch/arm/domain_build.c | 36 +++++++++++++++++++++++++++++-------
>  1 file changed, 29 insertions(+), 7 deletions(-)
> 
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index be98ff83b1..4be8a00171 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -822,9 +822,11 @@ static mfn_t __init acquire_shared_memory_bank(struct domain *d,
>  
>  static int __init assign_shared_memory(struct domain *d,
>                                         uint32_t addr_cells, uint32_t size_cells,
> -                                       paddr_t pbase, paddr_t psize)
> +                                       paddr_t pbase, paddr_t psize,
> +                                       paddr_t gbase)
>  {
>      mfn_t smfn;
> +    int ret = 0;
>  
>      dprintk(XENLOG_INFO,
>              "%pd: allocate static shared memory BANK %#"PRIpaddr"-%#"PRIpaddr".\n",
> @@ -838,8 +840,18 @@ static int __init assign_shared_memory(struct domain *d,
>       * DOMID_IO is auto-translated (i.e. it seems RAM 1:1). So we do not need
>       * to create mapping in the P2M.
>       */
> -    ASSERT(d == dom_io);
> -    return 0;
> +    if ( d != dom_io )
> +    {
> +        ret = guest_physmap_add_pages(d, gaddr_to_gfn(gbase), smfn,
> +                                      PFN_DOWN(psize));
> +        if ( ret )
> +        {
> +            printk(XENLOG_ERR "Failed to map shared memory to %pd.\n", d);
> +            return ret;
> +        }
> +    }
> +
> +    return ret;
>  }
>  
>  static int __init process_shm(struct domain *d,
> @@ -855,6 +867,8 @@ static int __init process_shm(struct domain *d,
>          paddr_t gbase, pbase, psize;
>          int ret = 0;
>          unsigned int i;
> +        const char *role_str;
> +        bool owner_dom_io = true;
>  
>          if ( !dt_device_is_compatible(shm_node, "xen,domain-shared-memory-v1") )
>              continue;
> @@ -891,20 +905,28 @@ static int __init process_shm(struct domain *d,
>                  return -EINVAL;
>              }
>  
> -        /* TODO: Consider owner domain is not the default dom_io. */
> +        /*
> +         * "role" property is optional and if it is defined explicitly,
> +         * then the owner domain is not the default "dom_io" domain.
> +         */
> +        if ( dt_property_read_string(shm_node, "role", &role_str) == 0 )
> +            owner_dom_io = false;
> +
>          /*
>           * 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
>           * only find the borrowers.
>           */
> -        if ( !is_shm_allocated_to_domio(pbase) )
> +        if ( (owner_dom_io && !is_shm_allocated_to_domio(pbase)) ||
> +             (!owner_dom_io && strcmp(role_str, "owner") == 0) )
>          {
>              /*
>               * We found the first borrower of the region, the owner was not
>               * specified, so they should be assigned to dom_io.
>               */
> -            ret = assign_shared_memory(dom_io, addr_cells, size_cells,
> -                                       pbase, psize);
> +            ret = assign_shared_memory(owner_dom_io ? dom_io : d,
> +                                       addr_cells, size_cells,
> +                                       pbase, psize, gbase);
>              if ( ret )
>                  return ret;
>          }
> -- 
> 2.25.1
>
diff mbox series

Patch

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index be98ff83b1..4be8a00171 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -822,9 +822,11 @@  static mfn_t __init acquire_shared_memory_bank(struct domain *d,
 
 static int __init assign_shared_memory(struct domain *d,
                                        uint32_t addr_cells, uint32_t size_cells,
-                                       paddr_t pbase, paddr_t psize)
+                                       paddr_t pbase, paddr_t psize,
+                                       paddr_t gbase)
 {
     mfn_t smfn;
+    int ret = 0;
 
     dprintk(XENLOG_INFO,
             "%pd: allocate static shared memory BANK %#"PRIpaddr"-%#"PRIpaddr".\n",
@@ -838,8 +840,18 @@  static int __init assign_shared_memory(struct domain *d,
      * DOMID_IO is auto-translated (i.e. it seems RAM 1:1). So we do not need
      * to create mapping in the P2M.
      */
-    ASSERT(d == dom_io);
-    return 0;
+    if ( d != dom_io )
+    {
+        ret = guest_physmap_add_pages(d, gaddr_to_gfn(gbase), smfn,
+                                      PFN_DOWN(psize));
+        if ( ret )
+        {
+            printk(XENLOG_ERR "Failed to map shared memory to %pd.\n", d);
+            return ret;
+        }
+    }
+
+    return ret;
 }
 
 static int __init process_shm(struct domain *d,
@@ -855,6 +867,8 @@  static int __init process_shm(struct domain *d,
         paddr_t gbase, pbase, psize;
         int ret = 0;
         unsigned int i;
+        const char *role_str;
+        bool owner_dom_io = true;
 
         if ( !dt_device_is_compatible(shm_node, "xen,domain-shared-memory-v1") )
             continue;
@@ -891,20 +905,28 @@  static int __init process_shm(struct domain *d,
                 return -EINVAL;
             }
 
-        /* TODO: Consider owner domain is not the default dom_io. */
+        /*
+         * "role" property is optional and if it is defined explicitly,
+         * then the owner domain is not the default "dom_io" domain.
+         */
+        if ( dt_property_read_string(shm_node, "role", &role_str) == 0 )
+            owner_dom_io = false;
+
         /*
          * 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
          * only find the borrowers.
          */
-        if ( !is_shm_allocated_to_domio(pbase) )
+        if ( (owner_dom_io && !is_shm_allocated_to_domio(pbase)) ||
+             (!owner_dom_io && strcmp(role_str, "owner") == 0) )
         {
             /*
              * We found the first borrower of the region, the owner was not
              * specified, so they should be assigned to dom_io.
              */
-            ret = assign_shared_memory(dom_io, addr_cells, size_cells,
-                                       pbase, psize);
+            ret = assign_shared_memory(owner_dom_io ? dom_io : d,
+                                       addr_cells, size_cells,
+                                       pbase, psize, gbase);
             if ( ret )
                 return ret;
         }