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 Remus v2 02/10] tools/libxc: introduce setup() and cleanup() on save
Date: Fri, 8 May 2015 10:45:11 +0100 [thread overview]
Message-ID: <554C85A7.5000103@citrix.com> (raw)
In-Reply-To: <1431077610-3366-3-git-send-email-yanghy@cn.fujitsu.com>
On 08/05/15 10:33, Yang Hongyang wrote:
> introduce setup() and cleanup() which subsume the
> ctx->save.ops.{setup,cleanup}() calls and also do allocate/free
> necessary memory.
> The SHADOW_OP_OFF hypercall also included in the cleanup().
>
> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
I would suggest swapping this with patch 1, to save introducing new
code, just to move it again in the next patch.
In general, a good change, but some comments...
> ---
> tools/libxc/xc_sr_save.c | 72 +++++++++++++++++++++++++++++-------------------
> 1 file changed, 44 insertions(+), 28 deletions(-)
>
> diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
> index cc3e6b1..2394bc4 100644
> --- a/tools/libxc/xc_sr_save.c
> +++ b/tools/libxc/xc_sr_save.c
> @@ -607,13 +607,10 @@ static int send_domain_memory_nonlive(struct xc_sr_context *ctx)
> return rc;
> }
>
> -/*
> - * Save a domain.
> - */
> -static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> +static int setup(struct xc_sr_context *ctx)
> {
> xc_interface *xch = ctx->xch;
> - int rc, saved_rc = 0, saved_errno = 0;
> + int rc;
> DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap,
> (&ctx->save.dirty_bitmap_hbuf));
>
> @@ -632,13 +629,51 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> goto err;
> }
>
> - IPRINTF("Saving domain %d, type %s",
> - ctx->domid, dhdr_type_to_str(guest_type));
> -
> rc = ctx->save.ops.setup(ctx);
> if ( rc )
> goto err;
>
> + rc = 0;
> +
> + err:
> + return rc;
> +
> +}
> +
> +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));
> +
> + 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");
> +
> + if ( dirty_bitmap )
> + xc_hypercall_buffer_free_pages(xch, dirty_bitmap,
> + NRPAGES(bitmap_size(ctx->save.p2m_size)));
xc_hypercall_buffer_free_pages() if fine dealing with NULL, just like
free() is. You can drop the conditional.
> + free(ctx->save.deferred_pages);
> + free(ctx->save.batch_pfns);
> +}
> +
> +/*
> + * Save a domain.
> + */
> +static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> +{
> + xc_interface *xch = ctx->xch;
> + int rc;
> +
> + rc = setup(ctx);
> + if ( rc )
> + goto err;
> +
> + IPRINTF("Saving domain %d, type %s",
> + ctx->domid, dhdr_type_to_str(guest_type));
> +
> xc_report_progress_single(xch, "Start of stream");
>
> rc = write_headers(ctx, guest_type);
> @@ -679,29 +714,10 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type)
> goto done;
>
> err:
> - saved_errno = errno;
> - saved_rc = rc;
> PERROR("Save failed");
>
> done:
> - xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF,
> - NULL, 0, NULL, 0, NULL);
> -
> - rc = ctx->save.ops.cleanup(ctx);
> - if ( rc )
> - 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);
> -
> - if ( saved_rc )
> - {
> - rc = saved_rc;
> - errno = saved_errno;
> - }
You must keep saved_{rc,errno}, so that the cleanup doesn't clobber the
errno semantically relevant to why the save failed.
~Andrew
> -
> + cleanup(ctx);
> return rc;
> };
>
next prev parent reply other threads:[~2015-05-08 9:45 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-08 9:33 [PATCH Remus v2 00/10] Remus support for Migration-v2 Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 01/10] tools/libxc: adjust the memory allocation for migration Yang Hongyang
2015-05-08 9:51 ` Andrew Cooper
2015-05-11 11:50 ` Ian Campbell
2015-05-12 6:43 ` Hongyang Yang
2015-05-08 9:33 ` [PATCH Remus v2 02/10] tools/libxc: introduce setup() and cleanup() on save Yang Hongyang
2015-05-08 9:45 ` Andrew Cooper [this message]
2015-05-08 9:59 ` Hongyang Yang
2015-05-08 10:08 ` Andrew Cooper
2015-05-11 1:20 ` Hongyang Yang
2015-05-11 11:47 ` Ian Campbell
2015-05-11 11:49 ` Ian Campbell
2015-05-12 7:04 ` Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 03/10] tools/libxc: rename send_some_pages to send_dirty_pages Yang Hongyang
2015-05-08 10:11 ` Andrew Cooper
2015-05-11 1:21 ` Hongyang Yang
2015-05-08 9:33 ` [PATCH Remus v2 04/10] tools/libxc: introduce DECLARE_HYPERCALL_BUFFER_USER_POINTER Yang Hongyang
2015-05-08 10:16 ` Andrew Cooper
2015-05-11 1:22 ` Hongyang Yang
2015-05-11 11:53 ` Ian Campbell
2015-05-12 7:18 ` Yang Hongyang
2015-05-12 8:19 ` Ian Campbell
2015-05-12 9:24 ` Yang Hongyang
2015-05-12 9:43 ` Ian Campbell
2015-05-12 9:48 ` Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 05/10] tools/libxc: reuse send_dirty_pages() in send_all_pages() Yang Hongyang
2015-05-08 10:17 ` Andrew Cooper
2015-05-08 9:33 ` [PATCH Remus v2 06/10] tools/libxc: introduce process_record() Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 07/10] tools/libxc: split read/handle qemu info Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 08/10] tools/libxc: implement Remus checkpointed save Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 09/10] tools/libxc: implement Remus checkpointed restore Yang Hongyang
2015-05-08 9:33 ` [PATCH Remus v2 10/10] tools/libxc: X86_PV_INFO can be sent multiple times under Remus Yang Hongyang
2015-05-08 18:12 ` [PATCH Remus v2 00/10] Remus support for Migration-v2 Andrew Cooper
2015-05-11 6:28 ` Hongyang Yang
2015-05-11 9:00 ` Andrew Cooper
2015-05-11 10:48 ` Hongyang Yang
2015-05-11 11:01 ` Andrew Cooper
2015-05-12 8:12 ` Yang Hongyang
2015-05-12 9:40 ` Andrew Cooper
2015-05-12 10:02 ` Yang Hongyang
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=554C85A7.5000103@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.