|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v10 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>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Changes since v9:
- Use the correct type to store the device model version.
- Initialize device_model_version in libxl__stream_write_init.
- Add Andrew Reviewed-by and Wei Acked-by.
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 | 21 ++++++++++++++++++++-
5 files changed, 44 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 c8402de..7ec2eb3 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3037,6 +3037,9 @@ struct libxl__stream_write_state {
libxl__datacopier_state dc;
sws_record_done_cb record_done_callback;
+ /* Cache device model version. */
+ libxl_device_model_version 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..80d9208 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);
}
@@ -207,6 +209,7 @@ void libxl__stream_write_init(libxl__stream_write_state
*stream)
FILLZERO(stream->emu_rec_hdr);
FILLZERO(stream->emu_sub_hdr);
stream->emu_body = NULL;
+ stream->device_model_version = LIBXL_DEVICE_MODEL_VERSION_UNKNOWN;
}
void libxl__stream_write_start(libxl__egc *egc,
@@ -223,7 +226,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 +237,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 +368,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 +424,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 |