|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 7/7] libxl: Wait for QEMU startup in stubdomain
To ensure the QEMU instance in a stubdomain is running before we unpause
an HVM guest that relies on it for a device model, we do a xenstore wait
on QEMU's indiction that it is running.
Signed-off-by: Eric Shelton <eshelton@xxxxxxxxx>
---
tools/libxl/libxl_dm.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index d03be4a..ad8d1dc 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1361,6 +1361,39 @@ out:
stubdom_pvqemu_cb(egc, &sdss->multidev, rc);
}
+static void stub_dm_watch_event(libxl__egc *egc, libxl__xswait_state *xswa,
+ int rc, const char *p)
+{
+ EGC_GC;
+ libxl__spawn_state *spawn = CONTAINER_OF(xswa, libxl__spawn_state, xswait);
+ libxl__dm_spawn_state *pvqemu =
+ CONTAINER_OF(spawn, libxl__dm_spawn_state, spawn);
+ libxl__stub_dm_spawn_state *sdss =
+ CONTAINER_OF(pvqemu, libxl__stub_dm_spawn_state, pvqemu);
+ uint32_t dm_domid = sdss->pvqemu.guest_domid;
+
+ if (rc) {
+ if (rc == ERROR_TIMEDOUT)
+ LIBXL__LOG(CTX, XTL_DEBUG, "%s: startup timed out", xswa->what);
+ if (dm_domid) {
+ sdss->dis.ao = sdss->dm.spawn.ao;
+ sdss->dis.domid = dm_domid;
+ sdss->dis.callback = spaw_stubdom_pvqemu_destroy_cb;
+ libxl__destroy_domid(egc, &sdss->dis);
+ }
+ return;
+ }
+
+ if (!p)
+ return;
+
+ if (strcmp(p, "running"))
+ return;
+
+ libxl__xswait_stop(gc, xswa);
+ sdss->callback(egc, &sdss->dm, rc);
+}
+
static void stubdom_pvqemu_cb(libxl__egc *egc,
libxl__multidev *multidev,
int rc)
@@ -1368,12 +1401,24 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
libxl__stub_dm_spawn_state *sdss = CONTAINER_OF(multidev, *sdss, multidev);
STATE_AO_GC(sdss->dm.spawn.ao);
uint32_t dm_domid = sdss->pvqemu.guest_domid;
+ libxl__xswait_state *xswait = &sdss->pvqemu.spawn.xswait;
if (rc) {
LOGE(ERROR, "error connecting nics devices");
goto out;
}
+ /* wait for PV stubdom QEMU instance to be ready */
+ libxl__xswait_init(xswait);
+ xswait->ao = sdss->dm.spawn.ao;
+ xswait->what = GCSPRINTF("stub domain %d startup", dm_domid);
+ xswait->path = GCSPRINTF("/local/domain/0/device-model/%d/state",
+ sdss->dm.guest_domid);
+ xswait->timeout_ms = LIBXL_DEVICE_MODEL_START_TIMEOUT * 1000;
+ xswait->callback = stub_dm_watch_event;
+ rc = libxl__xswait_start(gc, xswait);
+ if (rc) goto out;
+
rc = libxl_domain_unpause(CTX, dm_domid);
if (rc) goto out;
@@ -1387,7 +1432,6 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
return;
}
}
- sdss->callback(egc, &sdss->dm, rc);
}
static void spawn_stubdom_pvqemu_destroy_cb(libxl__egc *egc,
--
1.8.5.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |