aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl/libxl_device.c
diff options
context:
space:
mode:
authorRoger Pau Monne <roger.pau@citrix.com>2012-07-26 16:47:28 +0100
committerRoger Pau Monne <roger.pau@citrix.com>2012-07-26 16:47:28 +0100
commitaf5ef322304bb7e1017c06c32211529f0ea33601 (patch)
tree4b1b35c5d5374c686d48f4debc2a71a198277b33 /tools/libxl/libxl_device.c
parente158dcadaf6e6842791fe5114cc0e1de0e77ffbd (diff)
downloadxen-af5ef322304bb7e1017c06c32211529f0ea33601.tar.gz
xen-af5ef322304bb7e1017c06c32211529f0ea33601.tar.bz2
xen-af5ef322304bb7e1017c06c32211529f0ea33601.zip
libxl: fix removal of secondary consoles
Secondary consoles are processed by libxl with the rest of the devices by calling libxl__initiate_device_remove that waits for the device to reach state 6 before procceeding with the removal. When libxl is destroying the console devices, Qemu is already dead or dying, and xenconsoled completely ignores the state backend entry for console devices, since it performs the cleanup based on the result of reads/writes to the tty. Since we don't want to execute hotplug scripts for consoles, leave the behaviour as it was previously, and just nuke the backend/frontend xenstore entries by calling libxl__device_destroy. Report: http://markmail.org/message/yqgppcsdip6tnmh6 Reported-by: Ian Campbell <ian.campbell@eu.citrix.com> Signed-off-by: Roger Pau Monne <roger.pau@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/libxl/libxl_device.c')
-rw-r--r--tools/libxl/libxl_device.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index a1b60d7a4f..2429836046 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -81,6 +81,8 @@ static int libxl__num_devices(libxl__gc *gc, uint32_t domid)
for (i = 0; i < num_kinds; i++) {
if (libxl__device_kind_from_string(kinds[i], &kind))
continue;
+ if (kind == LIBXL__DEVICE_KIND_CONSOLE)
+ continue;
path = GCSPRINTF("/local/domain/%d/device/%s", domid, kinds[i]);
devs = libxl__xs_directory(gc, XBT_NULL, path, &num_devs);
@@ -522,10 +524,18 @@ void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs)
path = libxl__xs_read(gc, XBT_NULL, path);
GCNEW(dev);
if (path && libxl__parse_backend_path(gc, path, dev) == 0) {
- aodev = &aodevs->array[numdev];
dev->domid = domid;
dev->kind = kind;
dev->devid = atoi(devs[j]);
+ if (dev->backend_kind == LIBXL__DEVICE_KIND_CONSOLE) {
+ /* Currently console devices can be destroyed
+ * synchronously by just removing xenstore entries,
+ * this is what libxl__device_destroy does.
+ */
+ libxl__device_destroy(gc, dev);
+ continue;
+ }
+ aodev = &aodevs->array[numdev];
aodev->action = DEVICE_DISCONNECT;
aodev->dev = dev;
aodev->callback = libxl__ao_devices_callback;