[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Don't save Xen heap pages during domain save
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1276604289 -3600 # Node ID a2cc1db1af9c8f9b148c80f8b2c3f64bde7542f9 # Parent 094b826a2b8e2c17fe7004923352d459e0c23f13 Don't save Xen heap pages during domain save As discussed in the thread starting at http://lists.xensource.com/archives/html/xen-devel/2010-05/msg01383.html, don't save Xen heap pages in order to avoid overallocation when the domain gets restored, as those pages would get (temporarily) backed with normal RAM pages by the restore code. This requires making DOMCTL_getpageframeinfo{2,3} usable for HVM guests, meaning that the input to these must be treated as GMFNs. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- tools/libxc/xc_domain_save.c | 86 +++++++++++++++++++++++-------------------- xen/arch/x86/domctl.c | 10 +++-- 2 files changed, 52 insertions(+), 44 deletions(-) diff -r 094b826a2b8e -r a2cc1db1af9c tools/libxc/xc_domain_save.c --- a/tools/libxc/xc_domain_save.c Tue Jun 15 11:38:41 2010 +0100 +++ b/tools/libxc/xc_domain_save.c Tue Jun 15 13:18:09 2010 +0100 @@ -1288,56 +1288,62 @@ int xc_domain_save(xc_interface *xch, in goto out; } - if ( hvm ) - { - /* Look for and skip completely empty batches. */ - for ( j = 0; j < batch; j++ ) + /* Get page types */ + if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) ) + { + PERROR("get_pfn_type_batch failed"); + goto out; + } + + for ( run = j = 0; j < batch; j++ ) + { + unsigned long gmfn = pfn_batch[j]; + + if ( !hvm ) + gmfn = pfn_to_mfn(gmfn); + + if ( pfn_err[j] ) { - if ( !pfn_err[j] ) - break; - pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB; + if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB ) + continue; + DPRINTF("map fail: page %i mfn %08lx err %d\n", + j, gmfn, pfn_err[j]); + pfn_type[j] = XEN_DOMCTL_PFINFO_XTAB; + continue; } - if ( j == batch ) + + if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB ) { - munmap(region_base, batch*PAGE_SIZE); - continue; /* bail on this batch: no valid pages */ + DPRINTF("type fail: page %i mfn %08lx\n", j, gmfn); + continue; } - for ( ; j < batch; j++ ) - if ( pfn_err[j] ) - pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB; - } - else - { - /* Get page types */ - if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) ) + + /* canonicalise mfn->pfn */ + pfn_type[j] |= pfn_batch[j]; + ++run; + + if ( debug ) { - PERROR("get_pfn_type_batch failed"); - goto out; - } - - for ( j = 0; j < batch; j++ ) - { - unsigned long mfn = pfn_to_mfn(pfn_batch[j]); - - if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB ) - { - DPRINTF("type fail: page %i mfn %08lx\n", - j, mfn); - continue; - } - - if ( debug ) + if ( hvm ) + DPRINTF("%d pfn=%08lx sum=%08lx\n", + iter, + pfn_type[j], + csum_page(region_base + (PAGE_SIZE*j))); + else DPRINTF("%d pfn= %08lx mfn= %08lx [mfn]= %08lx" " sum= %08lx\n", iter, - pfn_type[j] | pfn_batch[j], - mfn, - mfn_to_pfn(mfn), + pfn_type[j], + gmfn, + mfn_to_pfn(gmfn), csum_page(region_base + (PAGE_SIZE*j))); - - /* canonicalise mfn->pfn */ - pfn_type[j] |= pfn_batch[j]; } + } + + if ( !run ) + { + munmap(region_base, batch*PAGE_SIZE); + continue; /* bail on this batch: no valid pages */ } if ( wrexact(io_fd, &batch, sizeof(unsigned int)) ) diff -r 094b826a2b8e -r a2cc1db1af9c xen/arch/x86/domctl.c --- a/xen/arch/x86/domctl.c Tue Jun 15 11:38:41 2010 +0100 +++ b/xen/arch/x86/domctl.c Tue Jun 15 13:18:09 2010 +0100 @@ -207,11 +207,12 @@ long arch_do_domctl( for ( j = 0; j < k; j++ ) { - unsigned long type = 0, mfn = arr[j]; + unsigned long type = 0, mfn = gmfn_to_mfn(d, arr[j]); page = mfn_to_page(mfn); - if ( unlikely(!mfn_valid(mfn)) ) + if ( unlikely(!mfn_valid(mfn)) || + unlikely(is_xen_heap_mfn(mfn)) ) type = XEN_DOMCTL_PFINFO_XTAB; else if ( xsm_getpageframeinfo(page) != 0 ) ; @@ -306,14 +307,15 @@ long arch_do_domctl( for ( j = 0; j < k; j++ ) { struct page_info *page; - unsigned long mfn = arr32[j]; + unsigned long mfn = gmfn_to_mfn(d, arr32[j]); page = mfn_to_page(mfn); if ( domctl->cmd == XEN_DOMCTL_getpageframeinfo3) arr32[j] = 0; - if ( unlikely(!mfn_valid(mfn)) ) + if ( unlikely(!mfn_valid(mfn)) || + unlikely(is_xen_heap_mfn(mfn)) ) arr32[j] |= XEN_DOMCTL_PFINFO_XTAB; else if ( xsm_getpageframeinfo(page) != 0 ) continue; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |