@@ -668,6 +668,13 @@ file.
=back
+=item B<suspend_event_channel=BOOLEAN>
+
+Create the xenstore path for the domain's suspend event channel. The
+existence of this path can cause problems with older PV drivers running
+in the guest. If this option is not specified then it will default to
+B<true>.
+
=back
=head2 Devices
@@ -176,10 +176,11 @@ The size of the video RAM this domain is configured with.
#### ~/device/suspend/event-channel = ""|EVTCHN [w]
-The domain's suspend event channel. The toolstack will create this
-path with an empty value which the guest may choose to overwrite.
+The domain's suspend event channel. The toolstack may create this
+path with an empty value which the guest may choose to overwrite. If
+the path does not exist then the guest may create it.
-If the guest overwrites this, it will be with the number of an unbound
+If the guest writes this, it will be with the number of an unbound
event channel port it has acquired. The toolstack is expected to use
an interdomain bind, and then, when it wishes to ask the guest to
suspend, to signal the event channel.
@@ -1272,10 +1272,22 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src);
* LIBXL_HAVE_CREATEINFO_DOMID
*
* libxl_domain_create_new() and libxl_domain_create_restore() will use
- * a domid specified in libxl_domain_create_info().
+ * a domid specified in libxl_domain_create_info.
*/
#define LIBXL_HAVE_CREATEINFO_DOMID
+/*
+ * LIBXL_HAVE_CREATEINFO_SUSPEND_EVENT_CHANNEL
+ *
+ * libxl_domain_create_info contains a boolean 'suspend_event_channel'
+ * value to control whether the xenstore path:
+ *
+ * /local/domain/$DOMID/device/suspend/event-channel (RW)
+ *
+ * is created.
+ */
+#define LIBXL_HAVE_CREATEINFO_SUSPEND_EVENT_CHANNEL
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
@@ -57,6 +57,8 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc,
if (!c_info->ssidref)
c_info->ssidref = SECINITSID_DOMU;
+ libxl_defbool_setdefault(&c_info->suspend_event_channel, true);
+
return 0;
}
@@ -750,7 +752,7 @@ retry_transaction:
roperm, ARRAY_SIZE(roperm));
libxl__xs_mknod(gc, t,
GCSPRINTF("%s/device", dom_path),
- roperm, ARRAY_SIZE(roperm));
+ rwperm, ARRAY_SIZE(rwperm));
libxl__xs_mknod(gc, t,
GCSPRINTF("%s/control", dom_path),
roperm, ARRAY_SIZE(roperm));
@@ -782,9 +784,13 @@ retry_transaction:
libxl__xs_mknod(gc, t,
GCSPRINTF("%s/control/sysrq", dom_path),
rwperm, ARRAY_SIZE(rwperm));
- libxl__xs_mknod(gc, t,
- GCSPRINTF("%s/device/suspend/event-channel", dom_path),
- rwperm, ARRAY_SIZE(rwperm));
+
+ if (libxl_defbool_val(info->suspend_event_channel))
+ libxl__xs_mknod(gc, t,
+ GCSPRINTF("%s/device/suspend/event-channel",
+ dom_path),
+ rwperm, ARRAY_SIZE(rwperm));
+
libxl__xs_mknod(gc, t,
GCSPRINTF("%s/data", dom_path),
rwperm, ARRAY_SIZE(rwperm));
@@ -418,6 +418,7 @@ libxl_domain_create_info = Struct("domain_create_info",[
("run_hotplug_scripts",libxl_defbool),
("driver_domain",libxl_defbool),
("passthrough", libxl_passthrough),
+ ("suspend_event_channel",libxl_defbool),
], dir=DIR_IN)
libxl_domain_restore_params = Struct("domain_restore_params", [
@@ -2725,6 +2725,9 @@ skip_usbdev:
parse_vkb_list(config, d_config);
+ xlu_cfg_get_defbool(config, "suspend_event_channel",
+ &c_info->suspend_event_channel, 0);
+
xlu_cfg_destroy(config);
}