xen/arm: introduce allocate_memory

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: Julien Grall <julien.grall@arm.com>
Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
This commit is contained in:
Stefano Stabellini authored and Julien Grall committed 2018-11-14 19:34:47 +00:00
1 parent bfeb4a5648
commit f2931b4233
1 file changed
+101
+101
View File
@@ -368,6 +368,107 @@ 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 long tot_size)
{
int res;
struct page_info *pg;
struct membank *bank;
unsigned int max_order = ~0;
bank = &kinfo->mem.bank[kinfo->mem.nr_banks];
bank->start = gfn_to_gaddr(sgfn);
bank->size = tot_size;
while ( tot_size > 0 )
{
unsigned int order = get_allocation_size(tot_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;
}
sgfn = gfn_add(sgfn, 1UL << order);
tot_size -= (1ULL << (PAGE_SHIFT + order));
}
kinfo->mem.nr_banks++;
kinfo->unassigned_mem -= bank->size;
return true;
}
static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo)
{
unsigned int i;
unsigned long bank_size;
printk(XENLOG_INFO "Allocating mappings totalling %ldMB for %pd:\n",
/* Don't want format this as PRIpaddr (16 digit hex) */
(unsigned long)(kinfo->unassigned_mem >> 20), d);
kinfo->mem.nr_banks = 0;
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;
bank_size = MIN(GUEST_RAM1_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++ )
{
printk(XENLOG_INFO "%pd BANK[%d] %#"PRIpaddr"-%#"PRIpaddr" (%ldMB)\n",
d,
i,
kinfo->mem.bank[i].start,
kinfo->mem.bank[i].start + kinfo->mem.bank[i].size,
/* Don't want format this as PRIpaddr (16 digit hex) */
(unsigned long)(kinfo->mem.bank[i].size >> 20));
}
return;
fail:
panic("Failed to allocate requested domain memory."
/* Don't want format this as PRIpaddr (16 digit hex) */
" %ldKB unallocated. Fix the VMs configurations.\n",
(unsigned long)kinfo->unassigned_mem >> 10);
}
#endif
static int __init write_properties(struct domain *d, struct kernel_info *kinfo,
const struct dt_device_node *node)
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.