[PATCH v1 6/6] tools/libxl,xl: add --compress flag to xl migrate
Marcus Granado <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <[email protected]> |
Wire the libxenguest XCFLAGS_COMPRESS_LZ4 bit added earlier in this series to libxl and xl: * xl migrate gets a new --compress option * libxl gets a new public flag LIBXL_SUSPEND_COMPRESS_LZ4 * LIBXL_SUSPEND_COMPRESS_LZ4 is mapped to XCFLAGS_COMPRESS_LZ4 No change to the default behaviour: without --compress, xl migrate continues to emit uncompressed PAGE_DATA records. Signed-off-by: Marcus Granado <[email protected]> --- docs/man/xl.1.pod.in | 8 ++++++++ tools/include/libxl.h | 1 + tools/libs/light/libxl_dom_save.c | 4 +++- tools/libs/light/libxl_domain.c | 1 + tools/libs/light/libxl_internal.h | 1 + tools/xl/xl_cmdtable.c | 2 ++ tools/xl/xl_migrate.c | 13 ++++++++++--- 7 files changed, 26 insertions(+), 4 deletions(-) diff --git a/docs/man/xl.1.pod.in b/docs/man/xl.1.pod.in index 88ccf7ad82..51d50cafd8 100644 --- a/docs/man/xl.1.pod.in +++ b/docs/man/xl.1.pod.in @@ -488,6 +488,14 @@ domain. Display huge (!) amount of debug information during the migration process. +=item B<--compress> + +Compress the memory stream using LZ4 inside libxenguest before sending it +to the destination host. This can significantly reduce migration time on +slow transports, and reduce dom0 CPU pressure during host evacuations when +the migration data is subsequently encrypted or copied through pipes. +Requires libxenguest to have been built against liblz4. + =item B<-p> Leave the domain on the receive side paused after migration. diff --git a/tools/include/libxl.h b/tools/include/libxl.h index 7c098edab6..bc1dbd1162 100644 --- a/tools/include/libxl.h +++ b/tools/include/libxl.h @@ -1908,6 +1908,7 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t domid, int fd, LIBXL_EXTERNAL_CALLERS_ONLY; #define LIBXL_SUSPEND_DEBUG 1 #define LIBXL_SUSPEND_LIVE 2 +#define LIBXL_SUSPEND_COMPRESS_LZ4 4 /* * Only suspend domain, do not save its state to file, do not destroy it. diff --git a/tools/libs/light/libxl_dom_save.c b/tools/libs/light/libxl_dom_save.c index d64fd64f2e..16b882ecf0 100644 --- a/tools/libs/light/libxl_dom_save.c +++ b/tools/libs/light/libxl_dom_save.c @@ -245,6 +245,7 @@ void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss) const libxl_domain_type type = dss->type; const int live = dss->live; const int debug = dss->debug; + const int compress_lz4 = dss->compress_lz4; const libxl_domain_remus_info *const r_info = dss->remus; libxl__srm_save_autogen_callbacks *const callbacks = &dss->sws.shs.callbacks.save.a; @@ -269,7 +270,8 @@ void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss) if (rc) goto out; dss->xcflags = (live ? XCFLAGS_LIVE : 0) - | (debug ? XCFLAGS_DEBUG : 0); + | (debug ? XCFLAGS_DEBUG : 0) + | (compress_lz4 ? XCFLAGS_COMPRESS_LZ4 : 0); /* Disallow saving a guest with vNUMA configured because migration * stream does not preserve node information. diff --git a/tools/libs/light/libxl_domain.c b/tools/libs/light/libxl_domain.c index 37fcd92871..86458a69c0 100644 --- a/tools/libs/light/libxl_domain.c +++ b/tools/libs/light/libxl_domain.c @@ -527,6 +527,7 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t domid, int fd, int flags, dss->type = type; dss->live = flags & LIBXL_SUSPEND_LIVE; dss->debug = flags & LIBXL_SUSPEND_DEBUG; + dss->compress_lz4 = flags & LIBXL_SUSPEND_COMPRESS_LZ4; dss->checkpointed_stream = LIBXL_CHECKPOINTED_STREAM_NONE; rc = libxl__fd_flags_modify_save(gc, dss->fd, diff --git a/tools/libs/light/libxl_internal.h b/tools/libs/light/libxl_internal.h index b65e0064b9..ff7a334501 100644 --- a/tools/libs/light/libxl_internal.h +++ b/tools/libs/light/libxl_internal.h @@ -3598,6 +3598,7 @@ struct libxl__domain_save_state { libxl_domain_type type; int live; int debug; + int compress_lz4; int checkpointed_stream; const libxl_domain_remus_info *remus; /* private */ diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c index 502244f683..1b1838735f 100644 --- a/tools/xl/xl_cmdtable.c +++ b/tools/xl/xl_cmdtable.c @@ -174,6 +174,8 @@ const struct cmd_spec cmd_table[] = { "-e Do not wait in the background (on <host>) for the death\n" " of the domain.\n" "--debug Print huge (!) amount of debug during the migration process.\n" + "--compress Compress the memory stream using LZ4 in libxenguest.\n" + " Requires libxenguest to be built against liblz4.\n" "-p Do not unpause domain after migrating it.\n" "-D Preserve the domain id" }, diff --git a/tools/xl/xl_migrate.c b/tools/xl/xl_migrate.c index 4b4a379aa1..31a8cb4f32 100644 --- a/tools/xl/xl_migrate.c +++ b/tools/xl/xl_migrate.c @@ -177,7 +177,7 @@ static void migrate_do_preamble(int send_fd, int recv_fd, pid_t child, } static void migrate_domain(uint32_t domid, int preserve_domid, - const char *rune, int debug, + const char *rune, int debug, int compress_lz4, const char *override_config_file) { pid_t child = -1; @@ -206,6 +206,8 @@ static void migrate_domain(uint32_t domid, int preserve_domid, if (debug) flags |= LIBXL_SUSPEND_DEBUG; + if (compress_lz4) + flags |= LIBXL_SUSPEND_COMPRESS_LZ4; rc = libxl_domain_suspend(ctx, domid, send_fd, flags, NULL); if (rc) { fprintf(stderr, "migration sender: libxl_domain_suspend failed" @@ -538,10 +540,11 @@ int main_migrate(int argc, char **argv) char *rune = NULL; char *host; int opt, daemonize = 1, monitor = 1, debug = 0, pause_after_migration = 0; - int preserve_domid = 0; + int preserve_domid = 0, compress_lz4 = 0; static struct option opts[] = { {"debug", 0, 0, 0x100}, {"live", 0, 0, 0x200}, + {"compress", 0, 0, 0x300}, COMMON_LONG_OPTS }; @@ -571,6 +574,9 @@ int main_migrate(int argc, char **argv) case 0x200: /* --live */ /* ignored for compatibility with xm */ break; + case 0x300: /* --compress */ + compress_lz4 = 1; + break; } domid = find_domain(argv[optind]); @@ -602,7 +608,8 @@ int main_migrate(int argc, char **argv) pause_after_migration ? " -p" : ""); } - migrate_domain(domid, preserve_domid, rune, debug, config_filename); + migrate_domain(domid, preserve_domid, rune, debug, compress_lz4, + config_filename); return EXIT_SUCCESS; } -- 2.43.0