From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: [PATCH 3/5] libxc: create unmapped initrd in domain builder if supported Date: Fri, 11 Sep 2015 14:32:20 +0200 Message-ID: <1441974742-27352-4-git-send-email-jgross@suse.com> References: <1441974742-27352-1-git-send-email-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1441974742-27352-1-git-send-email-jgross@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com, ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com, wei.liu2@citrix.com Cc: Juergen Gross List-Id: xen-devel@lists.xenproject.org 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 --- tools/libxc/xc_dom_core.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c index b510bbd..bb668b1 100644 --- a/tools/libxc/xc_dom_core.c +++ b/tools/libxc/xc_dom_core.c @@ -1019,8 +1019,10 @@ 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 ) + /* Load ramdisk if initial mapping required. */ + if ( dom->ramdisk_blob && + (!dom->parms.elf_notes[XEN_ELFNOTE_MOD_START_PFN].data.num || + dom->ramdisk_seg.vstart) ) { if ( xc_dom_build_ramdisk(dom) != 0 ) goto err; @@ -1059,10 +1061,28 @@ int xc_dom_build_image(struct xc_dom_image *dom) } if ( dom->alloc_bootstack ) dom->bootstack_pfn = xc_dom_alloc_page(dom, "boot stack"); + DOMPRINTF("%-20s: virt_alloc_end : 0x%" PRIx64 "", __FUNCTION__, dom->virt_alloc_end); DOMPRINTF("%-20s: virt_pgtab_end : 0x%" PRIx64 "", __FUNCTION__, dom->virt_pgtab_end); + + /* Prepare allocating unmapped memory. */ + if ( dom->virt_pgtab_end ) + dom->virt_alloc_end = dom->virt_pgtab_end; + + /* Load ramdisk if no initial mapping required. */ + if ( dom->ramdisk_blob && !dom->ramdisk_seg.vstart && + dom->parms.elf_notes[XEN_ELFNOTE_MOD_START_PFN].data.num ) + { + if ( xc_dom_build_ramdisk(dom) != 0 ) + goto err; + dom->flags |= SIF_MOD_START_PFN; + dom->ramdisk_seg.vend = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart; + dom->ramdisk_seg.vstart = dom->ramdisk_seg.pfn; + dom->ramdisk_seg.vend += dom->ramdisk_seg.vstart; + } + return 0; err: -- 2.1.4