Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
- index 3ed14a4fc1..cb7bc01c2e 100644
- --- a/xen/arch/arm/domain_build.c
- +++ b/xen/arch/arm/domain_build.c
- @@ -373,21 +373,53 @@ static void __init allocate_memory_11(struct domain *d,
- static bool __init allocate_bank_memory(struct domain *d,
- struct kernel_info *kinfo,
- gfn_t sgfn,
- - unsigned int order)
- + unsigned long size)
- {
- int res;
- struct page_info *pg;
- struct membank *bank;
- paddr_t gaddr = gfn_to_gaddr(sgfn), size = pfn_to_paddr(1UL << order);
- + unsigned int max_order = ~0;
- - pg = alloc_domheap_pages(d, order, 0);
- - if ( !pg )
- - return false;
- + while ( size > 0 )
- + {
- + unsigned int order = get_allocation_size(size);
- +
- + order = min(max_order, order);
- +
- + pg = alloc_domheap_pages(d, order, 0);
- + if ( !pg )
- + {
- + /*
- + * If we can't allocate one page, then it is unlikely to
- + * succeed in the next iteration. So bail out.
- + */
- + if ( !order )
- + return false;
- +
- + /*
- + * If we can't allocate memory with order, then it is
- + * unlikely to succeed in the next iteration.
- + * Record the order - 1 to avoid re-trying.
- + */
- + max_order = order - 1;
- + continue;
- + }
- +
- + res = guest_physmap_add_page(d, sgfn, page_to_mfn(pg), order);
- + if ( res )
- + {
- + dprintk(XENLOG_ERR, "Failed map pages to DOMU: %d", res);
- + return false;
- + }
- +
- + gfn = gfn_add(gfn, 1UL << order);
- + size -= (1ULL << (PAGE_SHIFT + order));
- + }
- 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;
- }
- @@ -408,6 +440,7 @@ static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo)
- unsigned int order = get_allocation_size(kinfo->unassigned_mem);
- unsigned int order_req;
- int i;
- + unsigned long bank_size;
- dprintk(XENLOG_INFO, "Allocating mappings totalling %ldMB for dom%d:\n",
- /* Don't want format this as PRIpaddr (16 digit hex) */
- @@ -415,20 +448,18 @@ static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo)
- kinfo->mem.nr_banks = 0;
- - order = get_allocation_size(kinfo->unassigned_mem);
- - if ( order > get_order_from_bytes(GUEST_RAM0_SIZE) )
- - order_req = get_order_from_bytes(GUEST_RAM0_SIZE);
- - else
- - order_req = order;
- - if ( !allocate_bank_memory(d, kinfo, gaddr_to_gfn(GUEST_RAM0_BASE), order_req) )
- + bank_size = min(GUEST_RAM0_SIZE, kinfo->unassigned_mem);
- + if ( !allocate_bank_memory(d, kinfo, gaddr_to_gfn(GUEST_RAM0_BASE),
- + bank_size) )
- goto fail;
- - order -= order_req;
- - if ( order > 0 )
- - {
- - if ( !allocate_bank_memory(d, kinfo, gaddr_to_gfn(GUEST_RAM1_BASE), order) )
- - goto fail;
- - }
- + bank_size = min(GUEST_RAM0_SIZE, kinfo->unassigned_mem);
- + if ( !allocate_bank_memory(d, kinfo, gaddr_to_gfn(GUEST_RAM1_BASE),
- + bank_size) )
- + goto fail;
- +
- + if ( kinfo->unassigned_mem )
- + goto fail;
- for( i = 0; i < kinfo->mem.nr_banks; i++ )
- {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement