|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 2/3] remus: implement remus checkpoint in v2 save
implement remus checkpoint in v2 save
Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx>
---
tools/libxc/saverestore/common.h | 1 +
tools/libxc/saverestore/save.c | 88 ++++++++++++++++++++++++----------------
2 files changed, 55 insertions(+), 34 deletions(-)
diff --git a/tools/libxc/saverestore/common.h b/tools/libxc/saverestore/common.h
index 24ba95b..1dd9f51 100644
--- a/tools/libxc/saverestore/common.h
+++ b/tools/libxc/saverestore/common.h
@@ -153,6 +153,7 @@ struct xc_sr_context
xc_dominfo_t dominfo;
bool checkpointed;
+ bool firsttime;
union
{
diff --git a/tools/libxc/saverestore/save.c b/tools/libxc/saverestore/save.c
index d2fa8a6..98a5c2f 100644
--- a/tools/libxc/saverestore/save.c
+++ b/tools/libxc/saverestore/save.c
@@ -375,6 +375,8 @@ static int send_domain_memory_live(struct xc_sr_context
*ctx)
goto out;
}
+ if ( ctx->checkpointed && !ctx->firsttime )
+ goto lastiter;
/* This juggling is required if logdirty is already on, e.g. VRAM tracking
*/
if ( xc_shadow_control(xch, ctx->domid,
XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY,
@@ -436,6 +438,7 @@ static int send_domain_memory_live(struct xc_sr_context
*ctx)
break;
}
+lastiter:
rc = suspend_domain(ctx);
if ( rc )
goto out;
@@ -570,44 +573,60 @@ static int save(struct xc_sr_context *ctx, uint16_t
guest_type)
if ( rc )
goto err;
- rc = ctx->save.ops.start_of_stream(ctx);
- if ( rc )
- goto err;
+ do {
+ rc = ctx->save.ops.start_of_stream(ctx);
+ if ( rc )
+ goto err;
- if ( ctx->save.live )
- {
- DPRINTF("Starting live migrate");
- rc = send_domain_memory_live(ctx);
- }
- else
- {
- DPRINTF("Starting nonlive save");
- rc = send_domain_memory_nonlive(ctx);
- }
+ if ( ctx->save.live )
+ {
+ DPRINTF("Starting live migrate");
+ rc = send_domain_memory_live(ctx);
+ }
+ else
+ {
+ DPRINTF("Starting nonlive save");
+ rc = send_domain_memory_nonlive(ctx);
+ }
- if ( rc )
- goto err;
+ if ( rc )
+ goto err;
- /* Refresh domain information now it has paused. */
- if ( (xc_domain_getinfo(xch, ctx->domid, 1, &ctx->dominfo) != 1) ||
- (ctx->dominfo.domid != ctx->domid) )
- {
- PERROR("Unable to refresh domain information");
- rc = -1;
- goto err;
- }
- else if ( (!ctx->dominfo.shutdown ||
- ctx->dominfo.shutdown_reason != SHUTDOWN_suspend ) &&
- !ctx->dominfo.paused )
- {
- ERROR("Domain has not been suspended");
- rc = -1;
- goto err;
- }
+ /* Refresh domain information now it has paused. */
+ if ( (xc_domain_getinfo(xch, ctx->domid, 1, &ctx->dominfo) != 1) ||
+ (ctx->dominfo.domid != ctx->domid) )
+ {
+ PERROR("Unable to refresh domain information");
+ rc = -1;
+ goto err;
+ }
+ else if ( (!ctx->dominfo.shutdown ||
+ ctx->dominfo.shutdown_reason != SHUTDOWN_suspend ) &&
+ !ctx->dominfo.paused )
+ {
+ ERROR("Domain has not been suspended");
+ rc = -1;
+ goto err;
+ }
- rc = ctx->save.ops.end_of_stream(ctx);
- if ( rc )
- goto err;
+ rc = ctx->save.ops.end_of_stream(ctx);
+ if ( rc )
+ goto err;
+
+ if ( ctx->checkpointed ) {
+ if ( ctx->firsttime )
+ ctx->firsttime = false;
+
+ ctx->save.callbacks->postcopy(ctx->save.callbacks->data);
+
+ rc = ctx->save.callbacks->checkpoint(ctx->save.callbacks->data);
+ if ( rc > 0 ) {
+ IPRINTF("Next checkpoint\n");
+ } else {
+ ctx->checkpointed = false;
+ }
+ }
+ } while ( ctx->checkpointed );
rc = write_end_record(ctx);
if ( rc )
@@ -653,6 +672,7 @@ int xc_domain_save2(xc_interface *xch, int io_fd, uint32_t
dom, uint32_t max_ite
ctx.save.live = !!(flags & XCFLAGS_LIVE);
ctx.save.debug = !!(flags & XCFLAGS_DEBUG);
ctx.checkpointed = !!(flags & XCFLAGS_CHECKPOINTED);
+ ctx.firsttime = true;
if ( ctx.checkpointed ) {
/* This is a checkpointed save, we need these callbacks */
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |