|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 8/8] xen: arm: allocate more than one bank for 1:1 domain 0 if needed
On Fri, 2014-06-27 at 13:52 +0100, Julien Grall wrote:
>
> On 27/06/14 10:24, Ian Campbell wrote:
> > On Thu, 2014-06-26 at 19:20 +0100, Julien Grall wrote:
> >> On 06/26/2014 11:17 AM, Ian Campbell wrote:
> >>> Depending on where Xen and the initial modules were loaded into RAM we
> >>> may not
> >>> be able to allocate a suitably contiguous block of memory for dom0.
> >>> Especially
> >>> since the allocations made by alloc_domheap_pages are naturally aligned
> >>> (e.g. a
> >>> 1GB allocation must be at a 1GB boundary).
> >>>
> >>> The alignment requirement in particular is a huge limitation, meaning
> >>> that even
> >>> dom0_mem0=1G on a 2GB system is pretty likely to fail unless you are very
> >>> careful with your load addresses. People were also having trouble with
> >>> dom0 >
> >>> 128MB on the 1GB cubieboard2 when using fairly standard load addresses for
> >>> things.
> >>>
> >>> This patch tries to allocate multiple banks of memory in order to try and
> >>> satisfy the entire requested domain 0 allocation. Sadly this turns out to
> >>> be
> >>> pretty tricky to arrange (see the large comment in the code).
> >>>
> >>> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> >>> Cc: Karim Raslan <karim.allah.ahmed@xxxxxxxxx>
> >>> ---
> >>> v3:
> >>> Handle running out of banks more gracefully
> >>> Allow order >= min_low_order, not strictly greater. Otherwise
> >>> dom0_mem=128M doesn't work.
> >>
> >> dom0_mem still not working on the versatile express (see my explanation
> >> a below).
> >
> >>
> >>> +static void allocate_memory_11(struct domain *d, struct kernel_info
> >>> *kinfo)
> >>> +{
> >>> + const unsigned int min_low_order =
> >>> + get_order_from_bytes(min_t(paddr_t, dom0_mem, MB(128)));
> >>> + const unsigned int min_order = get_order_from_bytes(MB(4));
> >>> + struct page_info *pg;
> >>> + unsigned int order = get_11_allocation_size(kinfo->unassigned_mem);
> >>> + int i;
> >>> +
> >>> + bool_t lowmem = is_32bit_domain(d);
> >>> + unsigned int bits;
> >>> +
> >>> + printk("Allocating 1:1 mappings totalling %ldMB for dom0:\n",
> >>> + /* Don't want format this as PRIpaddr (16 digit hex) */
> >>> + (unsigned long)(kinfo->unassigned_mem >> 20));
> >>> +
> >>> + kinfo->mem.nr_banks = 0;
> >>> +
> >>> + /*
> >>> + * First try and allocate the largest thing we can as low as
> >>> + * possible to be bank 0.
> >>> + */
> >>> + while ( order >= min_low_order )
> >>> + {
> >>> + for ( bits = order ; bits < (lowmem ? 32 : PADDR_BITS); bits++ )
> >>
> >> This has to be: bits <= (...). Indeed, we want to try all possible zone.
>
> After digging into the code, I confirm that we need the "<=".
>
> the zone is retrieved with this formula: fls(page_to_mfn(pg)), in the
> case of the versatile express the bank start mfn is 0x8000.
> So every page will reach the zone 20. At the same time zone 20 is equals
> to bits=32.
OK, thanks for digging.
> Futhermore, it looks like we always allocate memory from the top of this
> zone. Is it normal?
Normal behaviour is to allocate from as high as possible so I'm not
surprised that applies with a zone as well.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |