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:
Juergen Gross authored and Ian Campbell committed 2015-11-16 13:18:56 +00:00
1 parent d8db3c7db9
commit 8c45adec18
3 files changed
+26 -6

No files matched your search

+5
View File
@@ -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;
+17 -2
View File
@@ -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:
+4 -4
View File
@@ -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 )
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.