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

RE: [PATCH v5 7/8] xen/arm: create shared memory nodes in guest device tree


  • To: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>
  • From: Penny Zheng <Penny.Zheng@xxxxxxx>
  • Date: Mon, 4 Jul 2022 07:45:08 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; 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=X8FmYl87tvZLpRtZjpyus40w4spZQF0EdNwJFRPaW4w=; b=n/oj062YGCDBrKKYvfbAAwky7UvWmT9zpHraUwg28Q/JqGAzItCUylgejR3Ok68IE9vhKTUsbuHq767LWyijUnu14MZ99CoQhfTjK355jnMr/cO2D86i/7bGtDnZvvPqslSi6dKy0xsnJBJy4XLGHjVIl4M3nzcDwt1HKHJ7M57ooK9VJRiNfa3XFvOOtO837QGYVBlKgFiMIHHX9QIndxKL69NJzytBJpn0rDtZLBqqaVGtj3Tng01inZZ9SgjraxMQBztqiP/Hw9XQH3/Uugo7wYf+TS9pAmRpc+5ZYT+ofTtnGQUtIoA051pvHwVyWE33paPHtuHvMBRcK+Zi5A==
  • 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=X8FmYl87tvZLpRtZjpyus40w4spZQF0EdNwJFRPaW4w=; b=NToPHy6BLtAM5en2DDlUZuRf+e6HNBpJ/tmwgv8P8A3Niqkw+/Z3zW2w17JPqAO0pTsfIB7bwl8Hhsbl/5KJ339z6KhDBpMOPsrG6D0laebStRkyA9dewHFBiJyH9VWK7HiN0y5d0nze18XVAbnToWhJ/ByFV4KYWnLUAsq2zBEAkQrwHjzPjvzy5EBgyR4ntCpEX47/gZnkCfEQHC6ERo9LAm1Bua5KKE1/a6Odts36gMdolB0NGcGorB03FbcJAj83zHGB9eWUeZsf+Qs8xok+yWy8DNaZx2QCppTY35KOkyM4MxLocEdndkLVkQ8D0wvsKKxFkYdU3Dd5lCJTEw==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=oAtUZJmPuUmcyDNoySdhgn+d5aI1mMR0TdjH7cH4tVztTScfKIcSwXWTbSjR18QkMnaL8xhte1ZST0mLECdJ3etZq213QXbHGCugituJnmZQLEWE+WN8tqwmvJ3tbLu00uQjKAe1E9MsrjlIqZfAbf/z+ofP+DhZ2Qc9HUYA4LxSurXNn/CRvqJ7HqLO1ufD0TacwgGmyM5/GZ0f0HvHuims2Hcy5s20WiwR4BAnBzbDeNq9/W7nWOhsQ/c7uqZ5q+VgTyYdw2NLmX+KA4dR3JRX7B1rw5nhOzJYh4WvZ6LEEtE+26E/szmYwctYPhL/WMFjSLHBvajmiEa4sh6U3Q==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=E/M2UoL1jnVsMfAC7HJy7FWey2EYMzk33YSvB+l9oV8oBmV539Pl/a4JG/yFLsmY+IQYCH83wWKq+5BAfjbY85j1c63hCaiduyE7u2C8Z91z1lPUZA48OlsaqSz7mwstT91OD/pDjDtI6URBhTMcQWS4M77XH9kqbzlkKSd2ih4zc+AXsrzvZJtiHoi0lHZBk+hFdIqi98c6NWrt4N2kSrlUVYWEPVdSwzlZJZKP5/jNrXyc89c/bWXH8evkghujDS8xkg7zSVhI26cjBfT7vVTlGf62iuaeQTcdjGdbebr3fYhKazjbd///tup8bDxhyZwfl2E088tRIn8eKNnZ0g==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Wei Chen <Wei.Chen@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Mon, 04 Jul 2022 07:45:26 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHYhGRGiM2+sN9ON0uL+hMDdx46E61e+NuAgAApAYCADsZBcA==
  • Thread-topic: [PATCH v5 7/8] xen/arm: create shared memory nodes in guest device tree

Hi Stefano and Julien

> -----Original Message-----
> From: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> Sent: Saturday, June 25, 2022 5:57 AM
> To: Julien Grall <julien@xxxxxxx>
> Cc: Penny Zheng <Penny.Zheng@xxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx;
> Wei Chen <Wei.Chen@xxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; Bertrand Marquis <Bertrand.Marquis@xxxxxxx>;
> Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
> Subject: Re: [PATCH v5 7/8] xen/arm: create shared memory nodes in guest
> device tree
> 
> On Fri, 24 Jun 2022, Julien Grall wrote:
> > On 20/06/2022 06:11, Penny Zheng wrote:
> > > We expose the shared memory to the domU using the "xen,shared-
> memory-v1"
> > > reserved-memory binding. See
> > > Documentation/devicetree/bindings/reserved-memory/xen,shared-
> memory.
> > > txt in Linux for the corresponding device tree binding.
> > >
> > > To save the cost of re-parsing shared memory device tree
> > > configuration when creating shared memory nodes in guest device
> > > tree, this commit adds new field "shm_mem" to store shm-info per
> > > domain.
> > >
> > > 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> and has the following properties:
> > > - compatible:
> > >          compatible = "xen,shared-memory-v1"
> > > - reg:
> > >          the base guest physical address and size of the shared
> > > memory region
> > > - xen,id:
> > >          a string that identifies the shared memory region.
> > >
> > > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> > > Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> > > ---
> > > v5 change:
> > > - no change
> > > ---
> > > v4 change:
> > > - no change
> > > ---
> > > v3 change:
> > > - move field "shm_mem" to kernel_info
> > > ---
> > > v2 change:
> > > - using xzalloc
> > > - shm_id should be uint8_t
> > > - make reg a local variable
> > > - add #address-cells and #size-cells properties
> > > - fix alignment
> > > ---
> > >   xen/arch/arm/domain_build.c       | 143
> +++++++++++++++++++++++++++++-
> > >   xen/arch/arm/include/asm/kernel.h |   1 +
> > >   xen/arch/arm/include/asm/setup.h  |   1 +
> > >   3 files changed, 143 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/xen/arch/arm/domain_build.c
> > > b/xen/arch/arm/domain_build.c index 1584e6c2ce..4d62440a0e 100644
> > > --- a/xen/arch/arm/domain_build.c
> > > +++ b/xen/arch/arm/domain_build.c
> > > @@ -900,7 +900,22 @@ static int __init allocate_shared_memory(struct
> > > domain *d,
> > >       return ret;
> > >   }
> > >   -static int __init process_shm(struct domain *d,
> > > +static int __init append_shm_bank_to_domain(struct kernel_info *kinfo,
> > > +                                            paddr_t start, paddr_t size,
> > > +                                            u32 shm_id) {
> > > +    if ( (kinfo->shm_mem.nr_banks + 1) > NR_MEM_BANKS )
> > > +        return -ENOMEM;
> > > +
> > > +    kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].start = start;
> > > +    kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].size = size;
> > > +    kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].shm_id = shm_id;
> > > +    kinfo->shm_mem.nr_banks++;
> > > +
> > > +    return 0;
> > > +}
> > > +
> > > +static int __init process_shm(struct domain *d, struct kernel_info
> > > +*kinfo,
> > >                                 const struct dt_device_node *node)
> > >   {
> > >       struct dt_device_node *shm_node; @@ -971,6 +986,14 @@ static
> > > int __init process_shm(struct domain *d,
> > >               if ( ret )
> > >                   return ret;
> > >           }
> > > +
> > > +        /*
> > > +         * Record static shared memory region info for later setting
> > > +         * up shm-node in guest device tree.
> > > +         */
> > > +        ret = append_shm_bank_to_domain(kinfo, gbase, psize, shm_id);
> > > +        if ( ret )
> > > +            return ret;
> > >       }
> > >         return 0;
> > > @@ -1301,6 +1324,117 @@ static int __init make_memory_node(const
> > > struct domain *d,
> > >       return res;
> > >   }
> > >   +#ifdef CONFIG_STATIC_SHM
> > > +static int __init make_shm_memory_node(const struct domain *d,
> > > +                                       void *fdt,
> > > +                                       int addrcells, int sizecells,
> > > +                                       struct meminfo *mem)
> >
> > NIT: AFAICT mem is not changed, so it should be const.
> >
> > > +{
> > > +    unsigned long i = 0;
> >
> > NIT: This should be "unsigned int" to match the type of nr_banks.
> >
> > > +    int res = 0;
> > > +
> > > +    if ( mem->nr_banks == 0 )
> > > +        return -ENOENT;
> > > +
> > > +    /*
> > > +     * 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>.
> > > +     */
> > > +    dt_dprintk("Create xen-shmem node\n");
> > > +
> > > +    for ( ; i < mem->nr_banks; i++ )
> > > +    {
> > > +        uint64_t start = mem->bank[i].start;
> > > +        uint64_t size = mem->bank[i].size;
> > > +        uint8_t shm_id = mem->bank[i].shm_id;
> > > +        /* Placeholder for xen-shmem@ + a 64-bit number + \0 */
> > > +        char buf[27];
> > > +        const char compat[] = "xen,shared-memory-v1";
> > > +        __be32 reg[4];
> > > +        __be32 *cells;
> > > +        unsigned int len = (addrcells + sizecells) *
> > > + sizeof(__be32);
> > > +
> > > +        snprintf(buf, sizeof(buf), "xen-shmem@%"PRIx64,
> > > mem->bank[i].start);
> > > +        res = fdt_begin_node(fdt, buf);
> > > +        if ( res )
> > > +            return res;
> > > +
> > > +        res = fdt_property(fdt, "compatible", compat, sizeof(compat));
> > > +        if ( res )
> > > +            return res;
> > > +
> > > +        cells = reg;
> > > +        dt_child_set_range(&cells, addrcells, sizecells, start,
> > > + size);
> > > +
> > > +        res = fdt_property(fdt, "reg", reg, len);
> > > +        if ( res )
> > > +            return res;
> > > +
> > > +        dt_dprintk("Shared memory bank %lu: %#"PRIx64"->%#"PRIx64"\n",
> > > +                   i, start, start + size);
> > > +
> > > +        res = fdt_property_cell(fdt, "xen,id", shm_id);
> >
> > Looking at the Linux binding, "xen,id" is meant to be a string. But
> > here you are writing it as an integer.
> 
> Good catch!
> 
> 
> > Given that the Linux binding is already merged, I think the Xen
> > binding should be changed.
> 
> We would be compliant with both bindings (xen and linux) just by writing
> shm_id as string here, but if it is not too difficult we might as well 
> harmonize
> the two bindings and also define xen,shm-id as a string.
> 
> On the Xen side, I would suggest to put a clear size limit so that the string 
> is
> easier to handle.

I've already made the xen,shm-id parsed as a string too, seeing the below code:
"
    prop_id = fdt_get_property(fdt, node, "xen,shm-id", NULL);
    if ( !prop_id )
        return -ENOENT;
    shm_id = simple_strtoul(prop_id->data, NULL, 10);
    if ( shm_id >= NR_MEM_BANKS )
    {
        printk("fdt: invalid `xen,shm-id` %lu for static shared memory node.\n",
               shm_id);
        return -EINVAL;
    }
"
The size limit is smaller than 256, just as stated in doc:
"
- xen,shm-id

    A string that represents the unique identifier of the shared memory
    region. The maximum identifier shall be "xen,shm-id = 255".
"
Hope this fits what both of you suggested~~~



 


Rackspace

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