introduce setup() and cleanup() which subsume the ctx->save.ops.{setup,cleanup}() calls. The SHADOW_OP_OFF hypercall also included in the cleanup().
Signed-off-by: Yang Hongyang <yan...@cn.fujitsu.com> CC: Ian Campbell <ian.campb...@citrix.com> CC: Ian Jackson <ian.jack...@eu.citrix.com> CC: Wei Liu <wei.l...@citrix.com> CC: Andrew Cooper <andrew.coop...@citrix.com> --- tools/libxc/xc_sr_save.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c index caa727d..8a847fc 100644 --- a/tools/libxc/xc_sr_save.c +++ b/tools/libxc/xc_sr_save.c @@ -637,6 +637,32 @@ static int send_domain_memory_nonlive(struct xc_sr_context *ctx) return rc; } +static int setup(struct xc_sr_context *ctx) +{ + int rc; + + 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; + + 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"); +} + /* * Save a domain. */ @@ -648,7 +674,7 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type) IPRINTF("Saving domain %d, type %s", ctx->domid, dhdr_type_to_str(guest_type)); - rc = ctx->save.ops.setup(ctx); + rc = setup(ctx); if ( rc ) goto err; @@ -701,12 +727,7 @@ static int save(struct xc_sr_context *ctx, uint16_t guest_type) 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"); + cleanup(ctx); if ( saved_rc ) { -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel