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, eddie.dong@intel.com,
yunhong.jiang@intel.com, ian.jackson@eu.citrix.com,
rshriram@cs.ubc.ca
Subject: Re: [PATCH Remus v1 1/8] tools/libxc: adjust the memory allocation for migration
Date: Thu, 7 May 2015 10:48:39 +0100 [thread overview]
Message-ID: <554B34F7.5000009@citrix.com> (raw)
In-Reply-To: <1430980646-316-2-git-send-email-yanghy@cn.fujitsu.com>
On 07/05/15 07:37, 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>
> ---
> tools/libxc/xc_sr_save.c | 53 +++++++++++++++++++-----------------------------
> 1 file changed, 21 insertions(+), 32 deletions(-)
>
> diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
> index 5d9c267..7fed668 100644
> --- a/tools/libxc/xc_sr_save.c
> +++ b/tools/libxc/xc_sr_save.c
> @@ -3,6 +3,8 @@
>
> #include "xc_sr_common.h"
>
> +DECLARE_HYPERCALL_BUFFER(unsigned long, to_send);
This unfortunately causes an issue when concurrent calls to
xc_domain_save() in the same process. While this is a highly
ill-advised action, I did try to avoid breaking it.
Please move this declaration into the ctx.save union.
> +
> /*
> * Writes an Image header and Domain header into the stream.
> */
> @@ -475,25 +477,11 @@ 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, to_send);
> xc_shadow_op_stats_t stats = { 0, ctx->save.p2m_size };
> char *progress_str = NULL;
> unsigned x;
> int rc = -1;
>
> - to_send = xc_hypercall_buffer_alloc_pages(
> - xch, to_send, 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 || !to_send || !ctx->save.deferred_pages )
> - {
> - ERROR("Unable to allocate memory for to_{send,fix}/batch bitmaps");
> - goto out;
> - }
> -
> rc = enable_logdirty(ctx);
> if ( rc )
> goto out;
> @@ -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, to_send,
> - 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,9 +604,6 @@ 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;
> }
>
> @@ -645,6 +615,20 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> xc_interface *xch = ctx->xch;
> int rc, saved_rc = 0, saved_errno = 0;
>
> + to_send = xc_hypercall_buffer_alloc_pages(
> + xch, to_send, NRPAGES(bitmap_size(ctx->save.p2m_size)));
This allocation only needs to be made if ctx->save.live is set. For
plain suspend and resume, logdirty handling is not required.
> + 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 || !to_send || !ctx->save.deferred_pages )
> + {
> + ERROR("Unable to allocate memory for to_{send,fix}/batch bitmaps");
> + rc = -1;
> + errno = ENOMEM;
> + goto err;
> + }
> +
Instead of complicating save() like this, could you introduce two new
static functions setup() and cleanup() which subsume the
ctx->save.ops.{setup,cleanup}() calls and also do these allocations and
free.
I think the SHADOW_OP_OFF hypercall can also be moved into the cleanup()
function.
~Andrew
> IPRINTF("Saving domain %d, type %s",
> ctx->domid, dhdr_type_to_str(guest_type));
>
> @@ -704,6 +688,11 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> if ( rc )
> PERROR("Failed to clean up");
>
> + xc_hypercall_buffer_free_pages(xch, to_send,
> + NRPAGES(bitmap_size(ctx->save.p2m_size)));
> + free(ctx->save.deferred_pages);
> + free(ctx->save.batch_pfns);
> +
> if ( saved_rc )
> {
> rc = saved_rc;
next prev parent reply other threads:[~2015-05-07 9:48 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-07 6:37 [PATCH Remus v1 0/8] Remus support for Migration-v2 Yang Hongyang
2015-05-07 6:37 ` [PATCH Remus v1 1/8] tools/libxc: adjust the memory allocation for migration Yang Hongyang
2015-05-07 9:48 ` Andrew Cooper [this message]
2015-05-07 13:42 ` Hongyang Yang
2015-05-07 13:57 ` Ian Campbell
2015-05-08 9:11 ` Hongyang Yang
2015-05-08 16:27 ` David Vrabel
2015-05-08 16:42 ` Ian Campbell
2015-05-07 14:01 ` Andrew Cooper
2015-05-07 6:37 ` [PATCH Remus v1 2/8] tools/libxc: reuse send_some_pages() in send_all_pages() Yang Hongyang
2015-05-07 10:08 ` Andrew Cooper
2015-05-07 13:48 ` Hongyang Yang
2015-05-07 6:37 ` [PATCH Remus v1 3/8] tools/libxc: introduce process_record() Yang Hongyang
2015-05-07 10:12 ` Andrew Cooper
2015-05-07 6:37 ` [PATCH Remus v1 4/8] tools/libxc: split read/handle qemu info Yang Hongyang
2015-05-07 10:48 ` Andrew Cooper
2015-05-07 13:55 ` Hongyang Yang
2015-05-07 6:37 ` [PATCH Remus v1 5/8] tools/libxc: defer the setting of HVM_PARAM_IDENT_PT Yang Hongyang
2015-05-07 10:35 ` Andrew Cooper
2015-05-07 13:59 ` Hongyang Yang
2015-05-07 15:24 ` Andrew Cooper
2015-05-08 4:49 ` Hongyang Yang
2015-05-08 8:19 ` Andrew Cooper
2015-05-07 6:37 ` [PATCH Remus v1 6/8] tools/libxc: implement Remus checkpointed save Yang Hongyang
2015-05-07 6:37 ` [PATCH Remus v1 7/8] tools/libxc: implement Remus checkpointed restore Yang Hongyang
2015-05-07 6:37 ` [PATCH Remus v1 8/8] tools/libxc: X86_PV_INFO can be sent multiple times under Remus Yang Hongyang
2015-05-07 10:58 ` Andrew Cooper
2015-05-07 14:03 ` Hongyang Yang
2015-05-07 7:04 ` [PATCH Remus v1 0/8] Remus support for Migration-v2 Hongyang Yang
2015-05-07 9:31 ` Andrew Cooper
2015-05-07 15:07 ` Hongyang Yang
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=554B34F7.5000009@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.