[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v9 9/9] libxl: add support for migrating HVM guests without a device model
Only some minor libxl changes are needed in order to be able to migrate HVM guests without a device model, no hypervisor changes are needed. This change prevents sending the emulator context if the device model version is set to none. Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- Changes since v8: - Cache device model version inside of the libxl__stream_write_state structure. - Add a seatbelt by setting the emulator id to UNKNOWN in the HVMlite case. This can be used to assert we don't reach certain paths. - Remove stray STATE_AO_GC in emulator_xenstore_record_done. Changes since v7: - Prevent sending the emulator context and xenstore record in write_emulator_context_record and write_emulator_xenstore_record. - Error out if an emulator record is received for a no-dm guest. --- tools/libxl/libxl_dom.c | 3 +++ tools/libxl/libxl_dom_suspend.c | 2 ++ tools/libxl/libxl_internal.h | 3 +++ tools/libxl/libxl_stream_read.c | 16 ++++++++++++++++ tools/libxl/libxl_stream_write.c | 20 +++++++++++++++++++- 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 0f166e9..e730912 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1318,6 +1318,9 @@ void libxl__domain_suspend_common_switch_qemu_logdirty case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: domain_suspend_switch_qemu_xen_logdirty(domid, enable, shs); break; + case LIBXL_DEVICE_MODEL_VERSION_NONE: + libxl__xc_domain_saverestore_async_callback_done(egc, shs, 0); + break; default: LOG(ERROR,"logdirty switch failed" ", no valid device model version found, abandoning suspend"); diff --git a/tools/libxl/libxl_dom_suspend.c b/tools/libxl/libxl_dom_suspend.c index 4cc01ad..3313ad1 100644 --- a/tools/libxl/libxl_dom_suspend.c +++ b/tools/libxl/libxl_dom_suspend.c @@ -43,6 +43,8 @@ int libxl__domain_suspend_device_model(libxl__gc *gc, if (ret) unlink(filename); break; + case LIBXL_DEVICE_MODEL_VERSION_NONE: + break; default: return ERROR_INVAL; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 7e8054a..d6cb63d 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3036,6 +3036,9 @@ struct libxl__stream_write_state { libxl__datacopier_state dc; sws_record_done_cb record_done_callback; + /* Cache device model version. */ + int device_model_version; + /* Only used when constructing EMULATOR records. */ libxl__datacopier_state emu_dc; libxl__carefd *emu_carefd; diff --git a/tools/libxl/libxl_stream_read.c b/tools/libxl/libxl_stream_read.c index 4ec29da..258dec4 100644 --- a/tools/libxl/libxl_stream_read.c +++ b/tools/libxl/libxl_stream_read.c @@ -539,6 +539,14 @@ static bool process_record(libxl__egc *egc, break; case REC_TYPE_EMULATOR_XENSTORE_DATA: + if (dcs->guest_config->b_info.device_model_version == + LIBXL_DEVICE_MODEL_VERSION_NONE) { + rc = ERROR_FAIL; + LOG(ERROR, + "Received a xenstore emulator record when none was expected"); + goto err; + } + if (rec->hdr.length < sizeof(libxl__sr_emulator_hdr)) { rc = ERROR_FAIL; LOG(ERROR, @@ -560,6 +568,14 @@ static bool process_record(libxl__egc *egc, break; case REC_TYPE_EMULATOR_CONTEXT: + if (dcs->guest_config->b_info.device_model_version == + LIBXL_DEVICE_MODEL_VERSION_NONE) { + rc = ERROR_FAIL; + LOG(ERROR, + "Received an emulator context record when none was expected"); + goto err; + } + write_emulator_blob(egc, stream, rec); break; diff --git a/tools/libxl/libxl_stream_write.c b/tools/libxl/libxl_stream_write.c index 52a60d7..c9d1cc8 100644 --- a/tools/libxl/libxl_stream_write.c +++ b/tools/libxl/libxl_stream_write.c @@ -167,6 +167,8 @@ static void setup_emulator_write(libxl__egc *egc, void *body, sws_record_done_cb cb) { + assert(stream->emu_sub_hdr.id != EMULATOR_UNKNOWN); + assert(stream->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE); setup_generic_write(egc, stream, what, hdr, emu_hdr, body, cb); } @@ -223,7 +225,9 @@ void libxl__stream_write_start(libxl__egc *egc, stream->running = true; if (dss->type == LIBXL_DOMAIN_TYPE_HVM) { - switch (libxl__device_model_version_running(gc, dss->domid)) { + stream->device_model_version = + libxl__device_model_version_running(gc, dss->domid); + switch (stream->device_model_version) { case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: stream->emu_sub_hdr.id = EMULATOR_QEMU_TRADITIONAL; break; @@ -232,6 +236,10 @@ void libxl__stream_write_start(libxl__egc *egc, stream->emu_sub_hdr.id = EMULATOR_QEMU_UPSTREAM; break; + case LIBXL_DEVICE_MODEL_VERSION_NONE: + stream->emu_sub_hdr.id = EMULATOR_UNKNOWN; + break; + default: rc = ERROR_FAIL; LOG(ERROR, "Unknown emulator for HVM domain"); @@ -359,6 +367,11 @@ static void write_emulator_xenstore_record(libxl__egc *egc, char *buf = NULL; uint32_t len = 0; + if (stream->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { + emulator_xenstore_record_done(egc, stream); + return; + } + rc = libxl__save_emulator_xenstore_data(dss, &buf, &len); if (rc) goto err; @@ -410,6 +423,11 @@ static void write_emulator_context_record(libxl__egc *egc, assert(dss->type == LIBXL_DOMAIN_TYPE_HVM); + if (stream->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) { + emulator_context_record_done(egc, stream); + return; + } + /* Convenience aliases */ const char *const filename = dss->dm_savefile; -- 1.9.5 (Apple Git-50.3) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |