xl: support for leaving domain paused after save

New feature to allow xl save to leave a domain paused after its
memory has been saved. This is to allow disk snapshots of domU
to be taken that exactly correspond to the memory state at save time.
Once the snapshot(s) have been taken or whatever, the domain can be
unpaused in the usual manner.

Usage:
    xl save -p <domid> <filespec>

Signed-off-by: Ian Murray <murrayie@yahoo.co.uk>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Ian Murray authored and Ian Campbell committed 2013-07-17 10:39:22 +01:00
1 parent b179c6c490
commit 4d1759b515
3 files changed
+21 -8

No files matched your search

+5 -1
View File
@@ -504,7 +504,7 @@ Pass VNC password to vncviewer via stdin.
Saves a running domain to a state file so that it can be restored
later. Once saved, the domain will no longer be running on the
system, unless the -c option is used.
system, unless the -c or -p options are used.
B<xl restore> restores from this checkpoint file.
Passing a config file argument allows the user to manually select the VM config
file used to create the domain.
@@ -515,6 +515,10 @@ file used to create the domain.
Leave domain running after creating the snapshot.
=item B<-p>
Leave domain paused after creating the snapshot.
=back
=item B<sharing> [I<domain-id>]
+14 -6
View File
@@ -3266,7 +3266,7 @@ static void save_domain_core_writeconfig(int fd, const char *source,
}
static int save_domain(uint32_t domid, const char *filename, int checkpoint,
const char *override_config_file)
int leavepaused, const char *override_config_file)
{
int fd;
uint8_t *config_data;
@@ -3290,11 +3290,15 @@ static int save_domain(uint32_t domid, const char *filename, int checkpoint,
int rc = libxl_domain_suspend(ctx, domid, fd, 0, NULL);
close(fd);
if (rc < 0)
if (rc < 0) {
fprintf(stderr, "Failed to save domain, resuming domain\n");
if (checkpoint || rc < 0)
libxl_domain_resume(ctx, domid, 1, 0);
}
else if (leavepaused || checkpoint) {
if (leavepaused)
libxl_domain_pause(ctx, domid);
libxl_domain_resume(ctx, domid, 1, 0);
}
else
libxl_domain_destroy(ctx, domid, 0);
@@ -3838,12 +3842,16 @@ int main_save(int argc, char **argv)
const char *filename;
const char *config_filename = NULL;
int checkpoint = 0;
int leavepaused = 0;
int opt;
SWITCH_FOREACH_OPT(opt, "c", NULL, "save", 2) {
SWITCH_FOREACH_OPT(opt, "cp", NULL, "save", 2) {
case 'c':
checkpoint = 1;
break;
case 'p':
leavepaused = 1;
break;
}
if (argc-optind > 3) {
@@ -3856,7 +3864,7 @@ int main_save(int argc, char **argv)
if ( argc - optind >= 3 )
config_filename = argv[optind + 2];
save_domain(domid, filename, checkpoint, config_filename);
save_domain(domid, filename, checkpoint, leavepaused, config_filename);
return 0;
}
+2 -1
View File
@@ -142,7 +142,8 @@ struct cmd_spec cmd_table[] = {
"Save a domain state to restore later",
"[options] <Domain> <CheckpointFile> [<ConfigFile>]",
"-h Print this help.\n"
"-c Leave domain running after creating the snapshot."
"-c Leave domain running after creating the snapshot.\n"
"-p Leave domain paused after creating the snapshot."
},
{ "migrate",
&main_migrate, 0, 1,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.