|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 11/25] xen/arm: introduce allocate_memory
On Tue, 30 Oct 2018, Julien Grall wrote:
> Hi,
>
> On 23/10/2018 03:02, Stefano Stabellini wrote:
> > Introduce an allocate_memory function able to allocate memory for DomUs
> > and map it at the right guest addresses, according to the guest memory
> > map: GUEST_RAM0_BASE and GUEST_RAM1_BASE.
> >
> > This is under #if 0 as not used for now.
> >
> > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> > ---
> > Changes in v5:
> > - improve commit message
> > - code style
> > - remove unneeded local var
> > - while loop in allocate_bank_memory to allocate memory so that it
> > doesn't have to be contiguos
> > - combile while loops in allocate_memory
> >
> > Changes in v4:
> > - move earlier, add #if 0
> > - introduce allocate_bank_memory, remove insert_bank
> > - allocate_bank_memory allocate memory and inserts the bank, while
> > allocate_memory specifies where to do that
> >
> > Changes in v3:
> > - new patch
> > ---
> > xen/arch/arm/domain_build.c | 99
> > +++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 99 insertions(+)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index c61a27f..146d81e 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -368,6 +368,105 @@ static void __init allocate_memory_11(struct domain
> > *d,
> > }
> > }
> > +#if 0
> > +static bool __init allocate_bank_memory(struct domain *d,
> > + struct kernel_info *kinfo,
> > + gfn_t sgfn,
> > + unsigned int order)
>
> I don't think your implementation below is equivalent to the one I suggested
> earlier on ([1]). While you handled the contiguous problem, you didn't address
> the 2 others points:
> 1) The memory specify by the user may not be in power of 2 pages. For
> instance, a user can specify 40KB. With your algo, we will end to
> allocate 32KB in the first bank and 8KB in the second bank. However what
> we want is allocate 40KB in a single bank.
> 2) You don't check whether the leftover memory is bigger than the size
> of the second bank.
>
> Because of 1), you can't reason in term of order here. You have to reason in
> bytes or number of pages.
>
> > +{
> > + int res;
> > + struct page_info *pg;
> > + struct membank *bank;
> > + paddr_t size = pfn_to_paddr(1UL << order);
> > + gfn_t _sgfn = sgfn;
> > + gfn_t _egfn = gfn_add(sgfn, 1UL << order);
> > +
> > + while ( gfn_x(_sgfn) < gfn_x(_egfn) )
> > + {
> > + pg = alloc_domheap_pages(d, order, 0);
> > + if ( pg != NULL )
> > + {
> > + res = guest_physmap_add_page(d, _sgfn, page_to_mfn(pg), order);
> > + if ( res )
> > + {
> > + dprintk(XENLOG_ERR, "Failed map pages to DOMU: %d", res);
> > + goto fail;
> > + }
> > + _sgfn = gfn_add(_sgfn, 1UL << order);
> > + }
> > + else
> > + {
> > + order--;
>
> order may be equal to 0. So here you will underflow.
>
> Overall, it would be best if you re-use the code I sent. While not tested, it
> addresses all the problems. Fixing the potential bug in that patch so be quite
> easily.
OK, I'll add your Signed-off-by to the patch.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |