Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:FrontRunner
xen.11173
libxl.qmp-Tell-QEMU-about-live-migration-or-sna...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libxl.qmp-Tell-QEMU-about-live-migration-or-snapshot.patch of Package xen.11173
From: Anthony PERARD <anthony.perard@citrix.com> Date: Tue, 13 Mar 2018 11:13:18 +0000 Subject: libxl_qmp: Tell QEMU about live migration or snapshot Git-commit: db0c7dde021c29c2ae0d847d70fb7b59e02ea522 Since version 2.10, QEMU will lock the disk images so a second QEMU instance will not try to open it. This would prevent live migration from working correctly. A new parameter as been added to the QMP command "xen-save-devices-state" in QEMU version 2.11 which allow to unlock the disk image for a live migration, but also keep it locked for a snapshot. QEMU commit: 5d6c599fe1d69a1bf8c5c4d3c58be2b31cd625ad "migration, xen: Fix block image lock issue on live migration" The extra "live" parameter can only be use if QEMU knows about it, so only add it if qemu is recent enough. The struct libxl__domain_suspend_state as now knowledge if the suspend is part of a live migration. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Wei Liu <wei.liu2@citrix.com> --- tools/libxl/libxl_dom_save.c | 1 + tools/libxl/libxl_dom_suspend.c | 2 +- tools/libxl/libxl_internal.h | 4 +++- tools/libxl/libxl_qmp.c | 22 +++++++++++++++++----- 4 files changed, 22 insertions(+), 7 deletions(-) --- a/tools/libxl/libxl_dom_save.c +++ b/tools/libxl/libxl_dom_save.c @@ -361,6 +361,7 @@ void libxl__domain_save(libxl__egc *egc, dsps->ao = ao; dsps->domid = domid; + dsps->live = !!live; rc = libxl__domain_suspend_init(egc, dsps, type); if (rc) goto out; --- a/tools/libxl/libxl_dom_suspend.c +++ b/tools/libxl/libxl_dom_suspend.c @@ -86,7 +86,7 @@ int libxl__domain_suspend_device_model(l if (libxl__qmp_stop(gc, domid)) return ERROR_FAIL; /* Save DM state into filename */ - ret = libxl__qmp_save(gc, domid, filename); + ret = libxl__qmp_save(gc, domid, filename, dsps->live); if (ret) unlink(filename); break; --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1819,7 +1819,8 @@ _hidden int libxl__qmp_stop(libxl__gc *g /* Resume QEMU. */ _hidden int libxl__qmp_resume(libxl__gc *gc, int domid); /* Save current QEMU state into fd. */ -_hidden int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename); +_hidden int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename, + bool live); /* Load current QEMU state from file. */ _hidden int libxl__qmp_restore(libxl__gc *gc, int domid, const char *filename); /* Set dirty bitmap logging status */ @@ -3261,6 +3262,7 @@ struct libxl__domain_suspend_state { /* set by caller of libxl__domain_suspend_init */ libxl__ao *ao; uint32_t domid; + bool live; /* private */ libxl_domain_type type; --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -350,7 +350,6 @@ static int qmp_handle_response(libxl__gc return 0; } -#if 0 static bool qmp_qemu_check_version(libxl__qmp_handler *qmp, int major, int minor, int micro) { @@ -359,7 +358,6 @@ static bool qmp_qemu_check_version(libxl (qmp->version.minor > minor || (qmp->version.minor == minor && qmp->version.micro >= micro))); } -#endif /* * Handler functions @@ -942,13 +940,27 @@ int libxl__qmp_system_wakeup(libxl__gc * return qmp_run_command(gc, domid, "system_wakeup", NULL, NULL, NULL); } -int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename) +int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename, bool live) { libxl__json_object *args = NULL; + libxl__qmp_handler *qmp = NULL; + int rc; + + qmp = libxl__qmp_initialize(gc, domid); + if (!qmp) + return ERROR_FAIL; qmp_parameters_add_string(gc, &args, "filename", (char *)filename); - return qmp_run_command(gc, domid, "xen-save-devices-state", args, - NULL, NULL); + + /* live parameter was added to QEMU 2.11. It signal QEMU that the save + * operation is for a live migration rather that for taking a snapshot. */ + if (qmp_qemu_check_version(qmp, 2, 11, 0)) + qmp_parameters_add_bool(gc, &args, "live", live); + + rc = qmp_synchronous_send(qmp, "xen-save-devices-state", args, + NULL, NULL, qmp->timeout); + libxl__qmp_close(qmp); + return rc; } int libxl__qmp_restore(libxl__gc *gc, int domid, const char *state_file)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor