*/
#define LIBXL_HAVE_PVCALLS 1
+/*
+ * LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE
+ *
+ * If this is defined, libxl will only run a device-model if required.
+ */
+#define LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE 1
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
}
break;
default:
- b_info->device_model_version =
- LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
- break;
+ ret = libxl__need_xenpv_qemu(gc, d_config);
+ switch (ret) {
+ case 1:
+ d_config->b_info.device_model_version =
+ LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN;
+ break;
+ case 0:
+ d_config->b_info.device_model_version =
+ LIBXL_DEVICE_MODEL_VERSION_NONE;
+ break;
+ default:
+ LOGE(ERROR, "Unable to determine QEMU requisite");
+ return ret;
+ }
}
if (b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
libxl__ev_xswatch_deregister(gc, &dsps->guest_watch);
libxl__ev_time_deregister(gc, &dsps->guest_timeout);
- if (dsps->type == LIBXL_DOMAIN_TYPE_HVM) {
+ if (dsps->type == LIBXL_DOMAIN_TYPE_HVM ||
+ libxl__device_model_version_running(gc, dsps->domid) ==
+ LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
dsps->callback_device_model_done = domain_suspend_common_done;
libxl__domain_suspend_device_model(egc, dsps); /* must be last */
return;
goto out;
}
- if (type == LIBXL_DOMAIN_TYPE_HVM) {
+ if (type == LIBXL_DOMAIN_TYPE_HVM ||
+ libxl__device_model_version_running(gc, domid) ==
+ LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
rc = libxl__domain_resume_device_model(gc, domid);
if (rc) {
LOGD(ERROR, domid, "failed to resume device model:%d", rc);
(0, "UNKNOWN"),
(1, "QEMU_XEN_TRADITIONAL"), # Historical qemu-xen device model (qemu-dm)
(2, "QEMU_XEN"), # Upstream based qemu-xen device model
+ (3, "NONE"),
])
libxl_console_type = Enumeration("console_type", [