Message ID | 1450338502-27335-9-git-send-email-wency@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Dec 17, 2015 at 03:48:12PM +0800, Wen Congyang wrote: > From: Yang Hongyang <hongyang.yang@easystack.cn> > > In normal migration, the qemu state was passed to qemu as a parameter. /was/is/ > With COLO, Secondary vm is running. So we will do the following steps > at every checkpoint: > 1. suspend both primary vm and secondary vm > 2. sync the state > 3. resume both primary vm and secondary vm > Primary will send qemu's state in step2, and > Secondary's qemu should read it and restore the state before it s/Secondary/secondary/ > is resumed. We can not pass the state to qemu as a parameter because > Secondary QEMU already started at this point, so we introduce s/Secondary/secondary/ > libxl__domain_restore_device_model() to do it. > This API should be called before resuming secondary vm. s/before/MUST/ > > Signed-off-by: Yang Hongyang <hongyang.yang@easystack.cn> > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> > Cc: Anthony Perard <anthony.perard@citrix.com> > --- > tools/libxl/libxl_dom_save.c | 20 ++++++++++++++++++++ > tools/libxl/libxl_internal.h | 4 ++++ > tools/libxl/libxl_qmp.c | 10 ++++++++++ > 3 files changed, 34 insertions(+) > > diff --git a/tools/libxl/libxl_dom_save.c b/tools/libxl/libxl_dom_save.c > index 0bfa5fc..88cb1b3 100644 > --- a/tools/libxl/libxl_dom_save.c > +++ b/tools/libxl/libxl_dom_save.c > @@ -609,6 +609,26 @@ int libxl__restore_emulator_xenstore_data(libxl__domain_create_state *dcs, > return rc; > } > > +int libxl__domain_restore_device_model(libxl__gc *gc, uint32_t domid, > + const char *restore_file) > +{ > + int rc; > + > + switch (libxl__device_model_version_running(gc, domid)) { > + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: > + /* not supported now */ Perhaps: Will never be supported. > + rc = ERROR_INVAL; > + break; > + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: > + rc = libxl__qmp_restore(gc, domid, restore_file); > + break; > + default: > + rc = ERROR_INVAL; > + } > + > + return rc; > +} > +
On 01/26/2016 02:41 AM, Konrad Rzeszutek Wilk wrote: > On Thu, Dec 17, 2015 at 03:48:12PM +0800, Wen Congyang wrote: >> From: Yang Hongyang <hongyang.yang@easystack.cn> >> >> In normal migration, the qemu state was passed to qemu as a parameter. > > /was/is/ > >> With COLO, Secondary vm is running. So we will do the following steps >> at every checkpoint: >> 1. suspend both primary vm and secondary vm >> 2. sync the state >> 3. resume both primary vm and secondary vm >> Primary will send qemu's state in step2, and >> Secondary's qemu should read it and restore the state before it > > s/Secondary/secondary/ >> is resumed. We can not pass the state to qemu as a parameter because >> Secondary QEMU already started at this point, so we introduce > > s/Secondary/secondary/ >> libxl__domain_restore_device_model() to do it. >> This API should be called before resuming secondary vm. > > s/before/MUST/ s/should/MUST/? Thanks Wen Congyang > >> >> Signed-off-by: Yang Hongyang <hongyang.yang@easystack.cn> >> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> >> Cc: Anthony Perard <anthony.perard@citrix.com> >> --- >> tools/libxl/libxl_dom_save.c | 20 ++++++++++++++++++++ >> tools/libxl/libxl_internal.h | 4 ++++ >> tools/libxl/libxl_qmp.c | 10 ++++++++++ >> 3 files changed, 34 insertions(+) >> >> diff --git a/tools/libxl/libxl_dom_save.c b/tools/libxl/libxl_dom_save.c >> index 0bfa5fc..88cb1b3 100644 >> --- a/tools/libxl/libxl_dom_save.c >> +++ b/tools/libxl/libxl_dom_save.c >> @@ -609,6 +609,26 @@ int libxl__restore_emulator_xenstore_data(libxl__domain_create_state *dcs, >> return rc; >> } >> >> +int libxl__domain_restore_device_model(libxl__gc *gc, uint32_t domid, >> + const char *restore_file) >> +{ >> + int rc; >> + >> + switch (libxl__device_model_version_running(gc, domid)) { >> + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: >> + /* not supported now */ > > Perhaps: Will never be supported. > >> + rc = ERROR_INVAL; >> + break; >> + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: >> + rc = libxl__qmp_restore(gc, domid, restore_file); >> + break; >> + default: >> + rc = ERROR_INVAL; >> + } >> + >> + return rc; >> +} >> + > > > . >
On Tue, Jan 26, 2016 at 02:17:08PM +0800, Wen Congyang wrote: > On 01/26/2016 02:41 AM, Konrad Rzeszutek Wilk wrote: > > On Thu, Dec 17, 2015 at 03:48:12PM +0800, Wen Congyang wrote: > >> From: Yang Hongyang <hongyang.yang@easystack.cn> > >> > >> In normal migration, the qemu state was passed to qemu as a parameter. > > > > /was/is/ > > > >> With COLO, Secondary vm is running. So we will do the following steps > >> at every checkpoint: > >> 1. suspend both primary vm and secondary vm > >> 2. sync the state > >> 3. resume both primary vm and secondary vm > >> Primary will send qemu's state in step2, and > >> Secondary's qemu should read it and restore the state before it > > > > s/Secondary/secondary/ > >> is resumed. We can not pass the state to qemu as a parameter because > >> Secondary QEMU already started at this point, so we introduce > > > > s/Secondary/secondary/ > >> libxl__domain_restore_device_model() to do it. > >> This API should be called before resuming secondary vm. > > > > s/before/MUST/ > > s/should/MUST/? <sigh> Yes. Thank you!
diff --git a/tools/libxl/libxl_dom_save.c b/tools/libxl/libxl_dom_save.c index 0bfa5fc..88cb1b3 100644 --- a/tools/libxl/libxl_dom_save.c +++ b/tools/libxl/libxl_dom_save.c @@ -609,6 +609,26 @@ int libxl__restore_emulator_xenstore_data(libxl__domain_create_state *dcs, return rc; } +int libxl__domain_restore_device_model(libxl__gc *gc, uint32_t domid, + const char *restore_file) +{ + int rc; + + switch (libxl__device_model_version_running(gc, domid)) { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: + /* not supported now */ + rc = ERROR_INVAL; + break; + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + rc = libxl__qmp_restore(gc, domid, restore_file); + break; + default: + rc = ERROR_INVAL; + } + + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 9470d96..27a4590 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1115,6 +1115,8 @@ _hidden int libxl__domain_rename(libxl__gc *gc, uint32_t domid, const char *old_name, const char *new_name, xs_transaction_t trans); +_hidden int libxl__domain_restore_device_model(libxl__gc *gc, uint32_t domid, + const char *restore_file); _hidden int libxl__domain_resume_device_model(libxl__gc *gc, uint32_t domid); _hidden const char *libxl__userdata_path(libxl__gc *gc, uint32_t domid, @@ -1758,6 +1760,8 @@ _hidden int libxl__qmp_stop(libxl__gc *gc, int domid); _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); +/* Load current QEMU state from fd. */ +_hidden int libxl__qmp_restore(libxl__gc *gc, int domid, const char *filename); /* Set dirty bitmap logging status */ _hidden int libxl__qmp_set_global_dirty_log(libxl__gc *gc, int domid, bool enable); _hidden int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, const libxl_device_disk *disk); diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 714038b..eec8a44 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -905,6 +905,16 @@ int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename) NULL, NULL); } +int libxl__qmp_restore(libxl__gc *gc, int domid, const char *state_file) +{ + libxl__json_object *args = NULL; + + qmp_parameters_add_string(gc, &args, "filename", state_file); + + return qmp_run_command(gc, domid, "xen-load-devices-state", args, + NULL, NULL); +} + static int qmp_change(libxl__gc *gc, libxl__qmp_handler *qmp, char *device, char *target, char *arg) {