[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 14/16] xen/arm64: mm: Add memory to the boot allocator first
On Fri, 20 May 2022, Julien Grall wrote: > From: Julien Grall <jgrall@xxxxxxxxxx> > > Currently, memory is added to the boot allocator after the xenheap > mappings are done. This will break if the first mapping is more than > 512GB of RAM. > > In addition to that, a follow-up patch will rework setup_xenheap_mappings() > to use smaller mappings (e.g. 2MB, 4KB). So it will be necessary to have > memory in the boot allocator earlier. > > Only free memory (e.g. not reserved or modules) can be added to the boot > allocator. It might be possible that some regions (including the first > one) will have no free memory. > > So we need to add all the free memory to the boot allocator first > and then add do the mappings. > > Populating the boot allocator is nearly the same between arm32 and > arm64. The only difference is on the former we need to exclude the > xenheap for the boot allocator. Gate the difference with CONFIG_ARM_32 > so the code be re-used on arm64. > > Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Changes in v4: > - The implementation of populate_boot_allocator() has been > moved in a separate patch. > - Fix typo > > Changes in v3: > - Patch added > --- > xen/arch/arm/setup.c | 55 +++++++++++++++++++------------------------- > 1 file changed, 24 insertions(+), 31 deletions(-) > > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index 3d5a2283d4ef..db1768c03f03 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -636,13 +636,12 @@ static void __init init_staticmem_pages(void) > #endif > } > > -#ifdef CONFIG_ARM_32 > /* > * Populate the boot allocator. All the RAM but the following regions > * will be added: > * - Modules (e.g., Xen, Kernel) > * - Reserved regions > - * - Xenheap > + * - Xenheap (arm32 only) > */ > static void __init populate_boot_allocator(void) > { > @@ -672,6 +671,7 @@ static void __init populate_boot_allocator(void) > if ( e > bank_end ) > e = bank_end; > > +#ifdef CONFIG_ARM_32 > /* Avoid the xenheap */ > if ( s < mfn_to_maddr(xenheap_mfn_end) && > mfn_to_maddr(xenheap_mfn_start) < e ) > @@ -679,6 +679,7 @@ static void __init populate_boot_allocator(void) > e = mfn_to_maddr(xenheap_mfn_start); > n = mfn_to_maddr(xenheap_mfn_end); > } > +#endif > > fw_unreserved_regions(s, e, init_boot_pages, 0); > s = n; > @@ -686,6 +687,7 @@ static void __init populate_boot_allocator(void) > } > } > > +#ifdef CONFIG_ARM_32 > static void __init setup_mm(void) > { > paddr_t ram_start, ram_end, ram_size, e; > @@ -781,45 +783,36 @@ static void __init setup_mm(void) > #else /* CONFIG_ARM_64 */ > static void __init setup_mm(void) > { > + const struct meminfo *banks = &bootinfo.mem; > paddr_t ram_start = ~0; > paddr_t ram_end = 0; > paddr_t ram_size = 0; > - int bank; > + unsigned int i; > > init_pdx(); > > - total_pages = 0; > - for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ ) > - { > - paddr_t bank_start = bootinfo.mem.bank[bank].start; > - paddr_t bank_size = bootinfo.mem.bank[bank].size; > - paddr_t bank_end = bank_start + bank_size; > - paddr_t s, e; > - > - ram_size = ram_size + bank_size; > - ram_start = min(ram_start,bank_start); > - ram_end = max(ram_end,bank_end); > - > - setup_xenheap_mappings(bank_start>>PAGE_SHIFT, > bank_size>>PAGE_SHIFT); > - > - s = bank_start; > - while ( s < bank_end ) > - { > - paddr_t n = bank_end; > + /* > + * We need some memory to allocate the page-tables used for the xenheap > + * mappings. But some regions may contain memory already allocated > + * for other uses (e.g. modules, reserved-memory...). > + * > + * For simplicity, add all the free regions in the boot allocator. > + */ > + populate_boot_allocator(); > > - e = next_module(s, &n); > + total_pages = 0; > > - if ( e == ~(paddr_t)0 ) > - { > - e = n = bank_end; > - } > + for ( i = 0; i < banks->nr_banks; i++ ) > + { > + const struct membank *bank = &banks->bank[i]; > + paddr_t bank_end = bank->start + bank->size; > > - if ( e > bank_end ) > - e = bank_end; > + ram_size = ram_size + bank->size; > + ram_start = min(ram_start, bank->start); > + ram_end = max(ram_end, bank_end); > > - fw_unreserved_regions(s, e, init_boot_pages, 0); > - s = n; > - } > + setup_xenheap_mappings(PFN_DOWN(bank->start), > + PFN_DOWN(bank->size)); > } > > total_pages += ram_size >> PAGE_SHIFT; > -- > 2.32.0 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |