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

Re: [PATCH v3 12/12] xen/arm: List static shared memory regions as /memory nodes


  • To: Luca Fancellu <luca.fancellu@xxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Michal Orzel <michal.orzel@xxxxxxx>
  • Date: Mon, 22 Apr 2024 09:55:46 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=arm.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Fm+YWRwenv1ye/VHvqGEkNrQrzdHPLKDUQ9EWoI53tA=; b=fiIStNjz11nnxKzZetJRLMVQH+/11QnAilYaaN0Jaqdxvihj8kr5LhsKwsFvQC1+s+l3A3D3+TaZLtnU+doSkv9KFI1cT5PMsLkbVwfSbmkwN8iQ5WQEwckGV0Hqb8Pv/2At05aXnI/VFIAeQUFSI08U2oO0OyoxumcvPtI9P7Vze/9oHy8Uh/Qb2KtxFVssYc4bKWb2drRFjtLHxHovTn5EYoWXpRghATc2MroDQzx2xq1iqtdOXQzElhUEc8xoERCKlmcdBm6gXdYzmsL7Ms+Jl0ZKKddsw77ZqiiOb4e3rtOJrKL5juU0iYawoSx9zXCyXAaa0w3mY/jjeV0AtA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Vr+eH4ghBYvyzJmsvGxiwnP1fqnmBcJpXQiu5IpVB0oZVECIGxrlEUU9jT5hlWWR54ktdRmtQDDBHYqf94aoe9Rrzc9eDbLwMD7zyCdxLQ3jsNZgK1ZO1DjfyktoWhY5vKFVPeQEiWaoLJ9IWY1HgG0JylYOcFEpxPO84BGw/0VQUfaKVkgmHUJmJkFHxkrDcIcOlzBQ4XZPve3SdB7ErPNYNmPxIYbbM7Fs2zkEpf7Vmqu/OUuxCcBTEs6E50EoEvaFIgqiO55ZwO8ynJ8JZu8HFVjBm56PEjvYbK5/TN/D83pqi9MrCczBKqgtyc25QoFbWocIn4VQ12MQKRuvxw==
  • Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Mon, 22 Apr 2024 07:56:01 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Hi Luca,

On 18/04/2024 09:36, Luca Fancellu wrote:
> 
> 
> Currently Xen is not exporting the static shared memory regions
> to the device tree as /memory node, this commit is fixing this
> issue.
> 
> Given that now make_memory_node needs a parameter 'struct kernel_info'
> in order to call the new function shm_mem_node_fill_reg_range,
> take the occasion to remove the unused struct domain parameter.
> 
> Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
> ---
> v3:
>  - removed previous patch that was merging the intervals, rebase
>    changes.
> v2:
>  - try to use make_memory_node, don't add overlapping ranges of
>    memory, commit message changed.
> v1:
>  - new patch
> ---
> ---
>  xen/arch/arm/dom0less-build.c           |  2 +-
>  xen/arch/arm/domain_build.c             | 34 +++++++++++++++++--------
>  xen/arch/arm/include/asm/domain_build.h |  2 +-
>  xen/arch/arm/include/asm/static-shmem.h | 15 +++++++++++
>  xen/arch/arm/static-shmem.c             | 23 +++++++++++++++++
>  5 files changed, 63 insertions(+), 13 deletions(-)
> 
> diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
> index 51cf03221d56..74f053c242f4 100644
> --- a/xen/arch/arm/dom0less-build.c
> +++ b/xen/arch/arm/dom0less-build.c
> @@ -642,7 +642,7 @@ static int __init prepare_dtb_domU(struct domain *d, 
> struct kernel_info *kinfo)
>      if ( ret )
>          goto err;
> 
> -    ret = make_memory_node(d, kinfo->fdt, addrcells, sizecells,
> +    ret = make_memory_node(kinfo, addrcells, sizecells,
>                             kernel_info_get_mem(kinfo));
>      if ( ret )
>          goto err;
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 68532ddc084c..15f888169c4e 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -756,15 +756,14 @@ int __init domain_fdt_begin_node(void *fdt, const char 
> *name, uint64_t unit)
>      return fdt_begin_node(fdt, buf);
>  }
> 
> -int __init make_memory_node(const struct domain *d,
> -                            void *fdt,
> -                            int addrcells, int sizecells,
> -                            const struct membanks *mem)
> +int __init make_memory_node(const struct kernel_info *kinfo, int addrcells,
> +                            int sizecells, const struct membanks *mem)
>  {
> +    void *fdt = kinfo->fdt;
>      unsigned int i;
>      int res, reg_size = addrcells + sizecells;
>      int nr_cells = 0;
> -    __be32 reg[NR_MEM_BANKS * 4 /* Worst case addrcells + sizecells */];
> +    __be32 reg[DT_MEM_NODE_REG_RANGE_SIZE];
>      __be32 *cells;
> 
>      if ( mem->nr_banks == 0 )
> @@ -797,14 +796,28 @@ int __init make_memory_node(const struct domain *d,
>          if ( mem->bank[i].type == MEMBANK_STATIC_DOMAIN )
>              continue;
> 
> -        dt_dprintk("  Bank %d: %#"PRIx64"->%#"PRIx64"\n",
> -                   i, start, start + size);
> -
>          nr_cells += reg_size;
>          BUG_ON(nr_cells >= ARRAY_SIZE(reg));
>          dt_child_set_range(&cells, addrcells, sizecells, start, size);
>      }
> 
> +    /*
> +     * static shared memory banks need to be listed as /memory node, so when
> +     * this function is handling the normal memory, add the banks.
> +     */
> +    if ( mem == kernel_info_get_mem(kinfo) )
> +        shm_mem_node_fill_reg_range(kinfo, reg, &nr_cells, addrcells,
> +                                    sizecells);
> +
> +    for ( cells = reg, i = 0; cells < reg + nr_cells; i++, cells += reg_size 
> )
> +    {
> +        u64 start = dt_read_number(cells, addrcells);
We should no longer use Linux derived types like u64. Use uint64_t.

> +        u64 size = dt_read_number(cells + addrcells, sizecells);
> +
> +        dt_dprintk("  Bank %d: %#"PRIx64"->%#"PRIx64"\n",
> +                   i, start, start + size);
i is unsigned so the correct format specifier should be %u

> +    }
> +
>      dt_dprintk("(reg size %d, nr cells %d)\n", reg_size, nr_cells);
> 
>      res = fdt_property(fdt, "reg", reg, nr_cells * sizeof(*reg));
> @@ -1783,7 +1796,7 @@ static int __init handle_node(struct domain *d, struct 
> kernel_info *kinfo,
>          if ( res )
>              return res;
> 
> -        res = make_memory_node(d, kinfo->fdt, addrcells, sizecells,
> +        res = make_memory_node(kinfo, addrcells, sizecells,
>                                 kernel_info_get_mem(kinfo));
>          if ( res )
>              return res;
> @@ -1794,8 +1807,7 @@ static int __init handle_node(struct domain *d, struct 
> kernel_info *kinfo,
>           */
>          if ( reserved_mem->nr_banks > 0 )
>          {
> -            res = make_memory_node(d, kinfo->fdt, addrcells, sizecells,
> -                                   reserved_mem);
> +            res = make_memory_node(kinfo, addrcells, sizecells, 
> reserved_mem);
>              if ( res )
>                  return res;
>          }
> diff --git a/xen/arch/arm/include/asm/domain_build.h 
> b/xen/arch/arm/include/asm/domain_build.h
> index 026d975da28e..45936212ca21 100644
> --- a/xen/arch/arm/include/asm/domain_build.h
> +++ b/xen/arch/arm/include/asm/domain_build.h
> @@ -14,7 +14,7 @@ int make_chosen_node(const struct kernel_info *kinfo);
>  int make_cpus_node(const struct domain *d, void *fdt);
>  int make_hypervisor_node(struct domain *d, const struct kernel_info *kinfo,
>                           int addrcells, int sizecells);
> -int make_memory_node(const struct domain *d, void *fdt, int addrcells,
> +int make_memory_node(const struct kernel_info *kinfo, int addrcells,
>                       int sizecells, const struct membanks *mem);
>  int make_psci_node(void *fdt);
>  int make_timer_node(const struct kernel_info *kinfo);
> diff --git a/xen/arch/arm/include/asm/static-shmem.h 
> b/xen/arch/arm/include/asm/static-shmem.h
> index 7495a91e7a31..3b6569e5703f 100644
> --- a/xen/arch/arm/include/asm/static-shmem.h
> +++ b/xen/arch/arm/include/asm/static-shmem.h
> @@ -3,10 +3,15 @@
>  #ifndef __ASM_STATIC_SHMEM_H_
>  #define __ASM_STATIC_SHMEM_H_
> 
> +#include <xen/types.h>
>  #include <asm/kernel.h>
> +#include <asm/setup.h>
> 
>  #ifdef CONFIG_STATIC_SHM
> 
> +/* Worst case /memory node reg element: (addrcells + sizecells) */
> +#define DT_MEM_NODE_REG_RANGE_SIZE ((NR_MEM_BANKS + NR_SHMEM_BANKS) * 4)
> +
>  int make_resv_memory_node(const struct kernel_info *kinfo, int addrcells,
>                            int sizecells);
> 
> @@ -37,8 +42,14 @@ int remove_shm_holes_for_domU(const struct kernel_info 
> *kinfo,
>  int make_shm_resv_memory_node(const struct kernel_info *kinfo, int addrcells,
>                                int sizecells);
> 
> +void shm_mem_node_fill_reg_range(const struct kernel_info *kinfo, __be32 
> *reg,
> +                                 int *nr_cells, int addrcells, int 
> sizecells);
> +
>  #else /* !CONFIG_STATIC_SHM */
> 
> +/* Worst case /memory node reg element: (addrcells + sizecells) */
> +#define DT_MEM_NODE_REG_RANGE_SIZE (NR_MEM_BANKS * 4)
> +
>  static inline int make_resv_memory_node(const struct kernel_info *kinfo,
>                                          int addrcells, int sizecells)
>  {
> @@ -86,6 +97,10 @@ static inline int make_shm_resv_memory_node(const struct 
> kernel_info *kinfo,
>      return 0;
>  }
> 
> +static inline void shm_mem_node_fill_reg_range(const struct kernel_info 
> *kinfo,
> +                                               __be32 *reg, int *nr_cells,
> +                                               int addrcells, int sizecells) 
> {};
> +
>  #endif /* CONFIG_STATIC_SHM */
> 
>  #endif /* __ASM_STATIC_SHMEM_H_ */
> diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
> index c85f60dd1bf7..07c93a820508 100644
> --- a/xen/arch/arm/static-shmem.c
> +++ b/xen/arch/arm/static-shmem.c
> @@ -1,5 +1,6 @@
>  /* SPDX-License-Identifier: GPL-2.0-only */
> 
> +#include <xen/device_tree.h>
>  #include <xen/libfdt/libfdt.h>
>  #include <xen/rangeset.h>
>  #include <xen/sched.h>
> @@ -668,6 +669,28 @@ int __init remove_shm_holes_for_domU(const struct 
> kernel_info *kinfo,
>      return res;
>  }
> 
> +void __init shm_mem_node_fill_reg_range(const struct kernel_info *kinfo,
> +                                        __be32 *reg, int *nr_cells,
> +                                        int addrcells, int sizecells)
> +{
> +    const struct membanks *mem = &kinfo->shm_mem.common;
> +    unsigned int i;
> +    __be32 *cells;
> +
> +    BUG_ON(!nr_cells || !reg);
> +
> +    cells = &reg[*nr_cells];
> +    for ( i = 0; i < mem->nr_banks; i++ )
> +    {
> +        u64 start = mem->bank[i].start;
ditto

Rest LGTM:
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>

~Michal



 


Rackspace

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