All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Yang Hongyang <yanghy@cn.fujitsu.com>, xen-devel@lists.xen.org
Cc: wei.liu2@citrix.com, ian.campbell@citrix.com,
	wency@cn.fujitsu.com, ian.jackson@eu.citrix.com,
	yunhong.jiang@intel.com, eddie.dong@intel.com,
	rshriram@cs.ubc.ca
Subject: Re: [PATCH v4 09/14] libxc/save: adjust the memory allocation for migration
Date: Tue, 12 May 2015 13:14:20 +0100	[thread overview]
Message-ID: <5551EE9C.4030003@citrix.com> (raw)
In-Reply-To: <1431429922-15344-10-git-send-email-yanghy@cn.fujitsu.com>

On 12/05/15 12:25, Yang Hongyang wrote:
> Move the memory allocation before the concrete live/nolive save
> in order to avoid the free/alloc memory loop when using Remus.
>
> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
> CC: Ian Campbell <Ian.Campbell@citrix.com>
> CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
> CC: Wei Liu <wei.liu2@citrix.com>
> CC: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
>  tools/libxc/xc_sr_common.h |  1 +
>  tools/libxc/xc_sr_save.c   | 61 ++++++++++++++++++++++------------------------
>  2 files changed, 30 insertions(+), 32 deletions(-)
>
> diff --git a/tools/libxc/xc_sr_common.h b/tools/libxc/xc_sr_common.h
> index c0f90d4..276d00a 100644
> --- a/tools/libxc/xc_sr_common.h
> +++ b/tools/libxc/xc_sr_common.h
> @@ -190,6 +190,7 @@ struct xc_sr_context
>              unsigned nr_batch_pfns;
>              unsigned long *deferred_pages;
>              unsigned long nr_deferred_pages;
> +            xc_hypercall_buffer_t dirty_bitmap_hbuf;
>          } save;
>  
>          struct /* Restore data. */
> diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
> index 368aacb..0953c35 100644
> --- a/tools/libxc/xc_sr_save.c
> +++ b/tools/libxc/xc_sr_save.c
> @@ -475,24 +475,12 @@ static int update_progress_string(struct xc_sr_context *ctx,
>  static int send_domain_memory_live(struct xc_sr_context *ctx)
>  {
>      xc_interface *xch = ctx->xch;
> -    DECLARE_HYPERCALL_BUFFER(unsigned long, dirty_bitmap);
>      xc_shadow_op_stats_t stats = { 0, ctx->save.p2m_size };
>      char *progress_str = NULL;
>      unsigned x;
>      int rc = -1;
> -
> -    dirty_bitmap = xc_hypercall_buffer_alloc_pages(
> -        xch, dirty_bitmap, NRPAGES(bitmap_size(ctx->save.p2m_size)));
> -
> -    ctx->save.batch_pfns = malloc(MAX_BATCH_SIZE *
> -                                  sizeof(*ctx->save.batch_pfns));
> -    ctx->save.deferred_pages = calloc(1, bitmap_size(ctx->save.p2m_size));
> -
> -    if ( !ctx->save.batch_pfns || !dirty_bitmap || !ctx->save.deferred_pages )
> -    {
> -        ERROR("Unable to allocate memory for to_{send,fix}/batch bitmaps");
> -        goto out;
> -    }
> +    DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap,
> +                                    (&ctx->save.dirty_bitmap_hbuf));

You can drop this extra bracketing now that
DECLARE_HYPERCALL_BUFFER_SHADOW() has been fixed.

>  
>      rc = enable_logdirty(ctx);
>      if ( rc )
> @@ -593,10 +581,6 @@ static int send_domain_memory_live(struct xc_sr_context *ctx)
>    out:
>      xc_set_progress_prefix(xch, NULL);
>      free(progress_str);
> -    xc_hypercall_buffer_free_pages(xch, dirty_bitmap,
> -                                   NRPAGES(bitmap_size(ctx->save.p2m_size)));
> -    free(ctx->save.deferred_pages);
> -    free(ctx->save.batch_pfns);
>      return rc;
>  }
>  
> @@ -609,17 +593,6 @@ static int send_domain_memory_nonlive(struct xc_sr_context *ctx)
>      xc_interface *xch = ctx->xch;
>      int rc = -1;
>  
> -    ctx->save.batch_pfns = malloc(MAX_BATCH_SIZE *
> -                                  sizeof(*ctx->save.batch_pfns));
> -    ctx->save.deferred_pages = calloc(1, bitmap_size(ctx->save.p2m_size));
> -
> -    if ( !ctx->save.batch_pfns || !ctx->save.deferred_pages )
> -    {
> -        PERROR("Failed to allocate memory for nonlive tracking structures");
> -        errno = ENOMEM;
> -        goto err;
> -    }
> -
>      rc = suspend_domain(ctx);
>      if ( rc )
>          goto err;
> @@ -631,15 +604,30 @@ static int send_domain_memory_nonlive(struct xc_sr_context *ctx)
>          goto err;
>  
>   err:
> -    free(ctx->save.deferred_pages);
> -    free(ctx->save.batch_pfns);
> -
>      return rc;
>  }
>  
>  static int setup(struct xc_sr_context *ctx)
>  {
> +    xc_interface *xch = ctx->xch;
>      int rc;
> +    DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap,
> +                                    (&ctx->save.dirty_bitmap_hbuf));
> +
> +    dirty_bitmap = xc_hypercall_buffer_alloc_pages(
> +                   xch, dirty_bitmap, NRPAGES(bitmap_size(ctx->save.p2m_size)));
> +    ctx->save.batch_pfns = malloc(MAX_BATCH_SIZE *
> +                                  sizeof(*ctx->save.batch_pfns));
> +    ctx->save.deferred_pages = calloc(1, bitmap_size(ctx->save.p2m_size));
> +
> +    if ( !ctx->save.batch_pfns || !dirty_bitmap || !ctx->save.deferred_pages )
> +    {
> +        ERROR("Unable to allocate memory for dirty bitmaps, batch pfns and"
> +              " deferred pages");
> +        rc = -1;
> +        errno = ENOMEM;
> +        goto err;
> +    }
>  
>      rc = ctx->save.ops.setup(ctx);
>      if ( rc )
> @@ -655,12 +643,21 @@ static int setup(struct xc_sr_context *ctx)
>  static void cleanup(struct xc_sr_context *ctx)
>  {
>      xc_interface *xch = ctx->xch;
> +    DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap,
> +                                    (&ctx->save.dirty_bitmap_hbuf));

And also drop this bracketing.

> +
>  
>      xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF,
>                        NULL, 0, NULL, 0, NULL);
>  
>      if ( ctx->save.ops.cleanup(ctx) )
>          PERROR("Failed to clean up");
> +
> +    xc_hypercall_buffer_free_pages(xch, dirty_bitmap,
> +                                   NRPAGES(bitmap_size(ctx->save.p2m_size)));
> +    free(ctx->save.deferred_pages);
> +    free(ctx->save.batch_pfns);
> +

Stray blank line.

Otherwise, Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>

>  }
>  
>  /*

  reply	other threads:[~2015-05-12 12:14 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-12 11:25 [PATCH v4 00/14] Misc patches to aid migration v2 Remus support Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 01/14] libxc/migration: Be rather stricter with illformed callers Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 02/14] libxc/save: Adjust stream-position callbacks for checkpointed streams Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 03/14] libxc/migration: Specification update for CHECKPOINT records Yang Hongyang
2015-05-12 12:05   ` Andrew Cooper
2015-05-13  0:47     ` Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 04/14] libxc/migration: Pass checkpoint information into the save algorithm Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 05/14] tools/libxc: unused attribute in DECLARE_HYPERCALL_BUFFER_SHADOW Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 06/14] tools/libxc: add a check in xc_hypercall_buffer_free_pages macro Yang Hongyang
2015-05-12 12:10   ` Andrew Cooper
2015-05-13  0:48     ` Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 07/14] libxc/save: introduce setup() and cleanup() on save Yang Hongyang
2015-05-12 12:11   ` Andrew Cooper
2015-05-13  0:48     ` Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 08/14] libxc/save: rename to_send to dirty_bitmap Yang Hongyang
2015-05-12 12:11   ` Andrew Cooper
2015-05-12 11:25 ` [PATCH v4 09/14] libxc/save: adjust the memory allocation for migration Yang Hongyang
2015-05-12 12:14   ` Andrew Cooper [this message]
2015-05-13  0:49     ` Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 10/14] libxc/save: remove bitmap param from send_some_pages Yang Hongyang
2015-05-12 12:15   ` Andrew Cooper
2015-05-12 11:25 ` [PATCH v4 11/14] libxc/save: rename send_some_pages to send_dirty_pages Yang Hongyang
2015-05-12 12:15   ` Andrew Cooper
2015-05-12 11:25 ` [PATCH v4 12/14] libxc/save: reuse send_dirty_pages() in send_all_pages() Yang Hongyang
2015-05-12 12:17   ` Andrew Cooper
2015-05-12 11:25 ` [PATCH v4 13/14] libxc/restore: introduce process_record() Yang Hongyang
2015-05-12 11:25 ` [PATCH v4 14/14] libxc/restore: split read/handle qemu info Yang Hongyang
2015-05-12 12:20   ` Andrew Cooper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5551EE9C.4030003@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=eddie.dong@intel.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=rshriram@cs.ubc.ca \
    --cc=wei.liu2@citrix.com \
    --cc=wency@cn.fujitsu.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yanghy@cn.fujitsu.com \
    --cc=yunhong.jiang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.