|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v1 01/13] xen/arm: re-arrange the static shared memory region
> -----Original Message-----
> From: Julien Grall <julien@xxxxxxx>
> Sent: Sunday, January 8, 2023 7:44 PM
> To: Penny Zheng <Penny.Zheng@xxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Wei Chen <Wei.Chen@xxxxxxx>; Stefano Stabellini
> <sstabellini@xxxxxxxxxx>; Bertrand Marquis <Bertrand.Marquis@xxxxxxx>;
> Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
> Subject: Re: [PATCH v1 01/13] xen/arm: re-arrange the static shared memory
> region
>
> Hi Penny,
>
Hi Julien
> On 15/11/2022 02:52, Penny Zheng wrote:
> > This commit re-arranges the static shared memory regions into a
> > separate array shm_meminfo. And static shared memory region now
> would
> > have its own structure 'shm_membank' to hold all shm-related members,
> > like shm_id, etc, and a pointer to the normal memory bank 'membank'.
> > This will avoid continuing to grow 'membank'.
> >
> > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> > ---
> > xen/arch/arm/bootfdt.c | 40 +++++++++++++++++++------------
> > xen/arch/arm/domain_build.c | 35 ++++++++++++++++-----------
> > xen/arch/arm/include/asm/kernel.h | 2 +-
> > xen/arch/arm/include/asm/setup.h | 16 +++++++++----
> > 4 files changed, 59 insertions(+), 34 deletions(-)
> >
> > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index
> > 6014c0f852..ccf281cd37 100644
> > --- a/xen/arch/arm/bootfdt.c
> > +++ b/xen/arch/arm/bootfdt.c
> > @@ -384,6 +384,7 @@ static int __init process_shm_node(const void *fdt,
> int node,
> > const __be32 *cell;
> > paddr_t paddr, gaddr, size;
> > struct meminfo *mem = &bootinfo.reserved_mem;
>
> After this patch, 'mem' is barely going to be used. So I would recommend to
> remove it or restrict the scope.
>
Hope I understand correctly, you are saying that all static shared memory bank
will be
described as "struct shm_membank". That's right.
However when host address is provided, we still need an instance of "struct
membank"
to refer to in "bootinfo.reserved_mem". Only in this way, it could be
initialized properly in
as static pages.
That's why I put a "struct membank*" pointer in "struct shm_membank" to refer
to the
same object.
If I removed instance in bootinfo.reserved_mem, a few more path needs to be
updated, like
Init_staticmem_pages, dt_unreserved_regions, etc
> This will make easier to confirm that most of the use of 'mem' have been
> replaced with 'shm_mem' and reduce the risk of confusion between the two
> (the name are quite similar).
>
> [...]
>
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index bd30d3798c..c0fd13f6ed 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -757,20 +757,20 @@ static int __init
> acquire_nr_borrower_domain(struct domain *d,
> > {
> > unsigned int bank;
> >
> > - /* Iterate reserved memory to find requested shm bank. */
> > - for ( bank = 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ )
> > + /* Iterate static shared memory to find requested shm bank. */
> > + for ( bank = 0 ; bank < bootinfo.shm_mem.nr_banks; bank++ )
> > {
> > - paddr_t bank_start = bootinfo.reserved_mem.bank[bank].start;
> > - paddr_t bank_size = bootinfo.reserved_mem.bank[bank].size;
> > + paddr_t bank_start = bootinfo.shm_mem.bank[bank].membank-
> >start;
> > + paddr_t bank_size =
> > + bootinfo.shm_mem.bank[bank].membank->size;
>
> I was expecting a "if (type == MEMBANK_STATIC_DOMAIN) ..." to be
> removed. But it looks like there was none. I guess that was a mistake in the
> existing code?
>
Oh, you're right, the type shall also be checked.
> >
> > if ( (pbase == bank_start) && (psize == bank_size) )
> > break;
> > }
> >
> > - if ( bank == bootinfo.reserved_mem.nr_banks )
> > + if ( bank == bootinfo.shm_mem.nr_banks )
> > return -ENOENT;
> >
> > - *nr_borrowers =
> bootinfo.reserved_mem.bank[bank].nr_shm_borrowers;
> > + *nr_borrowers = bootinfo.shm_mem.bank[bank].nr_shm_borrowers;
> >
> > return 0;
> > }
> > @@ -907,11 +907,18 @@ static int __init
> append_shm_bank_to_domain(struct kernel_info *kinfo,
> > paddr_t start, paddr_t size,
> > const char *shm_id)
> > {
> > + struct membank *membank;
> > +
> > if ( kinfo->shm_mem.nr_banks >= 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;
> > + membank = xmalloc_bytes(sizeof(struct membank));
>
> You allocate memory but never free it. However, I think it would be better to
> avoid the dynamic allocation. So I would consider to not use the structure
> shm_membank and instead create a specific one for the domain construction.
>
True, a local variable "struct meminfo shm_banks" could be introduced only
for domain construction in function construct_domU
> > + if ( membank == NULL )
> > + return -ENOMEM;
> > +
> > + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank =
> membank;
> > + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank->start =
> start;
> > + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank->size =
> > + size;
>
> The last two could be replaced with:
>
> membank->start = start;
> membank->size = size;
>
> This would make the code more readable. Also, while you are modifying the
> code, I would consider to introduce a local variable that points to
> kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].
>
> [...]
>
> > struct meminfo {
> > @@ -61,6 +57,17 @@ struct meminfo {
> > struct membank bank[NR_MEM_BANKS];
> > };
> >
> > +struct shm_membank {
> > + char shm_id[MAX_SHM_ID_LENGTH];
> > + unsigned int nr_shm_borrowers;
> > + struct membank *membank;
>
> After the change I suggest above, I would expect that the field of
> membank will not be updated. So I would add const here.
>
> Cheers,
>
> --
> Julien Grall
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |