WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] don't save Xen heap pages during domain save

To: Jan Beulich <JBeulich@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] don't save Xen heap pages during domain save
From: Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
Date: Tue, 15 Jun 2010 13:22:59 +0100
Cc:
Delivery-date: Tue, 15 Jun 2010 05:26:00 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4C1783FB0200007800006777@xxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcsMgFrLOxvXegrnTRGEcnJuEggQsQABSLyR
Thread-topic: [Xen-devel] [PATCH] don't save Xen heap pages during domain save
User-agent: Microsoft-Entourage/12.24.0.100205
I've applied all your patches as of xen-unstable:21621. Are they all
suitable for Xen 4.0.x do you think? What about 3.4.x?

 Thanks,
 Keir

On 15/06/2010 12:45, "Jan Beulich" <JBeulich@xxxxxxxxxx> wrote:

> 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>
> 
> --- 2010-06-15.orig/tools/libxc/xc_domain_save.c 2010-06-01 13:39:57.000000000
> +0200
> +++ 2010-06-15/tools/libxc/xc_domain_save.c 2010-06-15 09:32:42.000000000
> +0200
> @@ -1288,58 +1288,64 @@ int xc_domain_save(xc_interface *xch, in
>                  goto out;
>              }
>  
> -            if ( hvm )
> +            /* Get page types */
> +            if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) )
>              {
> -                /* Look for and skip completely empty batches. */
> -                for ( j = 0; j < batch; j++ )
> -                {
> -                    if ( !pfn_err[j] )
> -                        break;
> -                    pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
> -                }
> -                if ( j == batch )
> -                {
> -                    munmap(region_base, batch*PAGE_SIZE);
> -                    continue; /* bail on this batch: no valid pages */
> -                }
> -                for ( ; j < batch; j++ )
> -                    if ( pfn_err[j] )
> -                        pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
> +                PERROR("get_pfn_type_batch failed");
> +                goto out;
>              }
> -            else
> +
> +            for ( run = 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;
> -                }
> +                unsigned long gmfn = pfn_batch[j];
>  
> -                for ( j = 0; j < batch; j++ )
> +                if ( !hvm )
> +                    gmfn = pfn_to_mfn(gmfn);
> +
> +                if ( pfn_err[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 )
> +                    DPRINTF("map fail: page %i mfn %08lx err %d\n",
> +                            j, gmfn, pfn_err[j]);
> +                    pfn_type[j] = XEN_DOMCTL_PFINFO_XTAB;
> +                    continue;
> +                }
> +
> +                if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB )
> +                {
> +                    DPRINTF("type fail: page %i mfn %08lx\n", j, gmfn);
> +                    continue;
> +                }
> +
> +                /* canonicalise mfn->pfn */
> +                pfn_type[j] |= pfn_batch[j];
> +                ++run;
> +
> +                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)) )
>              {
>                  PERROR("Error when writing to state file (2)");
> --- 2010-06-15.orig/xen/arch/x86/domctl.c 2010-03-02 09:11:28.000000000 +0100
> +++ 2010-06-15/xen/arch/x86/domctl.c 2010-06-15 09:32:42.000000000 +0200
> @@ -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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>