[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 14/28] libxl: emuids: Pass emuid to dm destruction
Rather than recomputing this with a switch() statement, etc., we rely on the emuidmap to tell us which qemus to destroy. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- v6: New patch. This is a new approach in v6. squash! libxl: Pass emuid to dm destruction --- tools/libxl/libxl.c | 31 ++++++++++++------------------- tools/libxl/libxl_dm.c | 13 +++++++++---- tools/libxl/libxl_internal.h | 3 ++- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 2a0c092..dff4478 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1606,7 +1606,8 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__destroy_domid_state *dis) libxl_ctx *ctx = CTX; uint32_t domid = dis->domid; char *dom_path; - int rc, dm_present; + int rc; + unsigned emuidmap; libxl__ev_child_init(&dis->destroyer); @@ -1633,27 +1634,19 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__destroy_domid_state *dis) goto out; } - switch (libxl__domain_type(gc, domid)) { - case LIBXL_DOMAIN_TYPE_HVM: - if (libxl_get_stubdom_id(CTX, domid)) { - dm_present = 0; - break; - } - /* fall through */ - case LIBXL_DOMAIN_TYPE_PV: - dm_present = 1; - break; - case LIBXL_DOMAIN_TYPE_INVALID: - rc = ERROR_FAIL; - goto out; - default: - abort(); - } + libxl__dm_emuidmap_get_bodgeerrors(gc, domid, &emuidmap); - if (dm_present) { - libxl__destroy_device_model(gc, domid); + libxl__destroy_device_model(gc, domid, emuidmap, EMUID_PV); + if (libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM && + libxl_get_stubdom_id(CTX, domid)) { + /* This is destroyed in libxl__domain_destroy */ + } else { + libxl__destroy_device_model(gc, domid, emuidmap, EMUID_DM); } + + libxl__destroy_device_model(gc, domid, emuidmap, EMUID_PV); + dis->drs.ao = ao; dis->drs.domid = domid; dis->drs.callback = devices_destroy_cb; diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 2bd1eb0..bcae664 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -2111,20 +2111,25 @@ out: return rc; } -int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid) +int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid, + unsigned emuidmap, int emuid) { int rc; + if (!(emuidmap & (1u << emuid))) + return 0; + char *path = libxl__device_model_xs_path(gc, LIBXL_TOOLSTACK_DOMID, - domid, EMUID_DM, ""); + domid, emuid, ""); if (!xs_rm(CTX->xsh, XBT_NULL, path)) LOG(ERROR, "xs_rm failed for %s", path); + /* We should try to destroy the device model anyway. */ rc = kill_device_model(gc, GCSPRINTF("/local/domain/%d/image/device-model-pid", domid)); if (rc) - LOG(ERROR, "libxl__destroy_device_model failed for %d", - domid); + LOG(ERROR, "libxl__destroy_device_model failed for %d (emuid=%d)", + domid, emuid); libxl__qmp_cleanup(gc, domid); return rc; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 0194823..4a9003d 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1656,7 +1656,8 @@ _hidden int libxl__wait_for_device_model_deprecated(libxl__gc *gc, void *userdata), void *check_callback_userdata); -_hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid); +_hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid, + unsigned emuidmap, int emuid); _hidden const libxl_vnc_info *libxl__dm_vnc(const libxl_domain_config *g_cfg); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |