mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
libxc: create unmapped initrd in domain builder if supported
In case the kernel of a new pv-domU indicates it is supporting an unmapped initrd, don't waste precious virtual space for the initrd, but allocate only guest physical memory for it. Signed-off-by: Juergen Gross <jgross@suse.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
d8db3c7db9
commit
8c45adec18
3 files changed
+26
-6
No files matched your search
@@ -97,6 +97,11 @@ struct xc_dom_image {
|
||||
xen_pfn_t pfn_alloc_end;
|
||||
xen_vaddr_t virt_alloc_end;
|
||||
xen_vaddr_t bsd_symtab_start;
|
||||
|
||||
/* initrd parameters as specified in start_info page */
|
||||
unsigned long initrd_start;
|
||||
unsigned long initrd_len;
|
||||
|
||||
unsigned int alloc_bootstack;
|
||||
xen_vaddr_t virt_pgtab_end;
|
||||
|
||||
|
||||
@@ -1041,6 +1041,7 @@ static int xc_dom_build_ramdisk(struct xc_dom_image *dom)
|
||||
int xc_dom_build_image(struct xc_dom_image *dom)
|
||||
{
|
||||
unsigned int page_size;
|
||||
bool unmapped_initrd;
|
||||
|
||||
DOMPRINTF_CALLED(dom->xch);
|
||||
|
||||
@@ -1064,11 +1065,15 @@ int xc_dom_build_image(struct xc_dom_image *dom)
|
||||
if ( dom->kernel_loader->loader(dom) != 0 )
|
||||
goto err;
|
||||
|
||||
/* load ramdisk */
|
||||
if ( dom->ramdisk_blob )
|
||||
/* Don't load ramdisk now if no initial mapping required. */
|
||||
unmapped_initrd = dom->parms.unmapped_initrd && !dom->ramdisk_seg.vstart;
|
||||
|
||||
if ( dom->ramdisk_blob && !unmapped_initrd )
|
||||
{
|
||||
if ( xc_dom_build_ramdisk(dom) != 0 )
|
||||
goto err;
|
||||
dom->initrd_start = dom->ramdisk_seg.vstart;
|
||||
dom->initrd_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
|
||||
}
|
||||
|
||||
/* load devicetree */
|
||||
@@ -1106,6 +1111,16 @@ int xc_dom_build_image(struct xc_dom_image *dom)
|
||||
if ( dom->virt_pgtab_end && xc_dom_alloc_pad(dom, dom->virt_pgtab_end) )
|
||||
return -1;
|
||||
|
||||
/* Load ramdisk if no initial mapping required. */
|
||||
if ( dom->ramdisk_blob && unmapped_initrd )
|
||||
{
|
||||
if ( xc_dom_build_ramdisk(dom) != 0 )
|
||||
goto err;
|
||||
dom->flags |= SIF_MOD_START_PFN;
|
||||
dom->initrd_start = dom->ramdisk_seg.pfn;
|
||||
dom->initrd_len = page_size * dom->ramdisk_seg.pages;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
|
||||
@@ -663,8 +663,8 @@ static int start_info_x86_32(struct xc_dom_image *dom)
|
||||
|
||||
if ( dom->ramdisk_blob )
|
||||
{
|
||||
start_info->mod_start = dom->ramdisk_seg.vstart;
|
||||
start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
|
||||
start_info->mod_start = dom->initrd_start;
|
||||
start_info->mod_len = dom->initrd_len;
|
||||
}
|
||||
|
||||
if ( dom->cmdline )
|
||||
@@ -710,8 +710,8 @@ static int start_info_x86_64(struct xc_dom_image *dom)
|
||||
|
||||
if ( dom->ramdisk_blob )
|
||||
{
|
||||
start_info->mod_start = dom->ramdisk_seg.vstart;
|
||||
start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart;
|
||||
start_info->mod_start = dom->initrd_start;
|
||||
start_info->mod_len = dom->initrd_len;
|
||||
}
|
||||
|
||||
if ( dom->cmdline )
|
||||
|
||||