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

Re: [PATCH v1 2/3] xen/dom0less: refactor architecture-specific DomU construction



On Tue, 13 May 2025, Oleksii Kurochko wrote:
> Refactor construct_domU() to improve architecture separation and reduce
> reliance on ARM-specific logic in common code:
> - Drop set_domain_type() from generic code. This function is specific
>   to ARM and serves no purpose on other architectures like RISC-V,
>   which lack the arch.type field in kernel_info.
> - Introduce arch_construct_domU() to encapsulate architecture-specific
>   DomU construction steps.
> - Implement arch_construct_domU() for ARM. This includes:
>   - Setting the domain type for CONFIG_ARM64.
>   - Handling static memory allocation if xen,static-mem is present in
>     the device tree.
>   - Processing static shared memory.
> - Move call of make_resv_memory_node() to Arm's make_arch_nodes() as
>   this call is specific to CONFIG_STATIC_SHM which is ARM specific,
>   at least, now.
> 
> This cleanup avoids empty stubs on other architectures and moves
> ARM-specific logic into arch code where it belongs.
> 
> Also, don't loose  a return value of functions called in
> Arm's make_arch_nodes().
> 
> Suggested-by: Michal Orzel <michal.orzel@xxxxxxx>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
> ---
>  xen/arch/arm/dom0less-build.c            | 42 +++++++++++++++++-------
>  xen/common/device-tree/dom0less-build.c  | 30 ++---------------
>  xen/include/asm-generic/dom0less-build.h |  3 +-
>  3 files changed, 36 insertions(+), 39 deletions(-)
> 
> diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
> index a49764f0ad..592173268f 100644
> --- a/xen/arch/arm/dom0less-build.c
> +++ b/xen/arch/arm/dom0less-build.c
> @@ -220,9 +220,14 @@ int __init make_arch_nodes(struct kernel_info *kinfo)
>  {
>      int ret;
>  
> +    ret = make_resv_memory_node(kinfo, GUEST_ROOT_ADDRESS_CELLS,
> +                                GUEST_ROOT_SIZE_CELLS);
> +    if ( ret )
> +        return ret;
> +
>      ret = make_psci_node(kinfo->fdt);
>      if ( ret )
> -        return -EINVAL;
> +        return ret;
>  
>      if ( kinfo->arch.vpl011 )
>      {
> @@ -230,26 +235,41 @@ int __init make_arch_nodes(struct kernel_info *kinfo)
>          ret = make_vpl011_uart_node(kinfo);
>  #endif
>          if ( ret )
> -            return -EINVAL;
> +            return ret;
>      }
>  
>      return 0;
>  }
>  
> -/* TODO: make arch.type generic ? */
> -#ifdef CONFIG_ARM_64
> -void __init set_domain_type(struct domain *d, struct kernel_info *kinfo)
> +int __init arch_construct_domU(struct kernel_info *kinfo,
> +                               const struct dt_device_node *node)
>  {
> +    int rc = 0;
> +    struct domain *d = kinfo->d;
> +
> +#ifdef CONFIG_ARM_64
>      /* type must be set before allocate memory */
>      d->arch.type = kinfo->arch.type;
> -}
> -#else
> -void __init set_domain_type(struct domain *d, struct kernel_info *kinfo)
> -{
> -    /* Nothing to do */
> -}
>  #endif

NIT: I think it would be nicer to do 

if ( is_hardware_domain(d) )
    return rc;

but it is also OK as below

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> +    if ( !is_hardware_domain(d) )
> +    {
> +        if ( dt_find_property(node, "xen,static-mem", NULL) )
> +        {
> +            if ( !is_domain_direct_mapped(d) )
> +                allocate_static_memory(d, kinfo, node);
> +            else
> +                assign_static_memory_11(d, kinfo, node);
> +        }
> +
> +        rc = process_shm(d, kinfo, node);
> +        if ( rc < 0 )
> +            return rc;
> +    }
> +
> +    return rc;
> +}
> +
>  int __init init_vuart(struct domain *d, struct kernel_info *kinfo,
>                        const struct dt_device_node *node)
>  {
> diff --git a/xen/common/device-tree/dom0less-build.c 
> b/xen/common/device-tree/dom0less-build.c
> index 2c56f13771..f6aabc2093 100644
> --- a/xen/common/device-tree/dom0less-build.c
> +++ b/xen/common/device-tree/dom0less-build.c
> @@ -28,14 +28,6 @@
>  #include <asm/dom0less-build.h>
>  #include <asm/setup.h>
>  
> -#if __has_include(<asm/static-memory.h>)
> -#   include <asm/static-memory.h>
> -#endif
> -
> -#if __has_include(<asm/static-shmem.h>)
> -#   include <asm/static-shmem.h>
> -#endif
> -
>  #define XENSTORE_PFN_LATE_ALLOC UINT64_MAX
>  
>  static domid_t __initdata xs_domid = DOMID_INVALID;
> @@ -507,12 +499,6 @@ static int __init prepare_dtb_domU(struct domain *d, 
> struct kernel_info *kinfo)
>      if ( ret )
>          goto err;
>  
> -#ifdef CONFIG_STATIC_SHM
> -    ret = make_resv_memory_node(kinfo, addrcells, sizecells);
> -    if ( ret )
> -        goto err;
> -#endif
> -
>      /*
>       * domain_handle_dtb_bootmodule has to be called before the rest of
>       * the device tree is generated because it depends on the value of
> @@ -787,7 +773,9 @@ static int __init construct_domU(struct domain *d,
>      if ( rc < 0 )
>          return rc;
>  
> -    set_domain_type(d, &kinfo);
> +    rc = arch_construct_domU(&kinfo, node);
> +    if ( rc )
> +        return rc;
>  
>      if ( is_hardware_domain(d) )
>      {
> @@ -799,18 +787,6 @@ static int __init construct_domU(struct domain *d,
>      {
>          if ( !dt_find_property(node, "xen,static-mem", NULL) )
>              allocate_memory(d, &kinfo);
> -#ifdef CONFIG_STATIC_MEMORY
> -        else if ( !is_domain_direct_mapped(d) )
> -            allocate_static_memory(d, &kinfo, node);
> -        else
> -            assign_static_memory_11(d, &kinfo, node);
> -#endif
> -
> -#ifdef CONFIG_STATIC_SHM
> -        rc = process_shm(d, &kinfo, node);
> -        if ( rc < 0 )
> -            return rc;
> -#endif
>  
>          rc = init_vuart(d, &kinfo, node);
>          if ( rc < 0 )
> diff --git a/xen/include/asm-generic/dom0less-build.h 
> b/xen/include/asm-generic/dom0less-build.h
> index e0ad0429ec..78142e71ca 100644
> --- a/xen/include/asm-generic/dom0less-build.h
> +++ b/xen/include/asm-generic/dom0less-build.h
> @@ -56,7 +56,8 @@ int init_vuart(struct domain *d, struct kernel_info *kinfo,
>  int make_intc_domU_node(struct kernel_info *kinfo);
>  int make_arch_nodes(struct kernel_info *kinfo);
>  
> -void set_domain_type(struct domain *d, struct kernel_info *kinfo);
> +int arch_construct_domU(struct kernel_info *kinfo,
> +                        const struct dt_device_node *node);
>  
>  int init_intc_phandle(struct kernel_info *kinfo, const char *name,
>                        const int node_next, const void *pfdt);
> -- 
> 2.49.0
> 



 


Rackspace

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