Or at least, give it an asynchronous interface so that we can make it actually asynchronous in subsequent patches.
Create state structures and callback function signatures. Add the state structure to libxl__destroy_domid_state. Break libxl__destroy_domid down into two functions. No functional change intended. Signed-off-by: George Dunlap <george.dun...@citrix.com> --- v2: - Note that libxl__devicemodel_destroy_cb may be called reentrantly NB that I retain the comment before libxl__destroy_device_model, in spite of the fact that it looks "pointless", to separate it logically from the previous prototype. CC: Ian Jackson <ian.jack...@citrix.com> CC: Wei Liu <wei.l...@citrix.com> --- tools/libxl/libxl_dm.c | 11 +++++++--- tools/libxl/libxl_domain.c | 40 ++++++++++++++++++++++++++++-------- tools/libxl/libxl_internal.h | 20 ++++++++++++++++-- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index db10b692dc..7f9c6a62fe 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -2677,19 +2677,24 @@ out: return rc; } -int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid) +void libxl__destroy_device_model(libxl__egc *egc, + libxl__destroy_devicemodel_state *ddms) { + STATE_AO_GC(ddms->ao); int rc; + int domid = ddms->domid; char *path = DEVICE_MODEL_XS_PATH(gc, LIBXL_TOOLSTACK_DOMID, domid, ""); + if (!xs_rm(CTX->xsh, XBT_NULL, path)) LOGD(ERROR, domid, "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)); - + libxl__qmp_cleanup(gc, domid); - return rc; + ddms->callback(egc, ddms, rc); } /* Return 0 if no dm needed, 1 if needed and <0 if error. */ diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c index d46b97dedf..0ce1ba1327 100644 --- a/tools/libxl/libxl_domain.c +++ b/tools/libxl/libxl_domain.c @@ -1008,6 +1008,10 @@ static void destroy_finish_check(libxl__egc *egc, } /* Callbacks for libxl__destroy_domid */ +static void dm_destroy_cb(libxl__egc *egc, + libxl__destroy_devicemodel_state *ddms, + int rc); + static void devices_destroy_cb(libxl__egc *egc, libxl__devices_remove_state *drs, int rc); @@ -1066,16 +1070,18 @@ void libxl__destroy_domid(libxl__egc *egc, libxl__destroy_domid_state *dis) if (rc < 0) { LOGEVD(ERROR, rc, domid, "xc_domain_pause failed"); } + if (dm_present) { - if (libxl__destroy_device_model(gc, domid) < 0) - LOGD(ERROR, domid, "libxl__destroy_device_model failed"); + dis->ddms.ao = ao; + dis->ddms.domid = domid; + dis->ddms.callback = dm_destroy_cb; + + libxl__destroy_device_model(egc, &dis->ddms); + return; + } else { + dm_destroy_cb(egc, &dis->ddms, 0); + return; } - dis->drs.ao = ao; - dis->drs.domid = domid; - dis->drs.callback = devices_destroy_cb; - dis->drs.force = 1; - libxl__devices_destroy(egc, &dis->drs); - return; out: assert(rc); @@ -1083,6 +1089,24 @@ out: return; } +static void dm_destroy_cb(libxl__egc *egc, + libxl__destroy_devicemodel_state *ddms, + int rc) +{ + libxl__destroy_domid_state *dis = CONTAINER_OF(ddms, *dis, ddms); + STATE_AO_GC(dis->ao); + uint32_t domid = dis->domid; + + if (rc < 0) + LOGD(ERROR, domid, "libxl__destroy_device_model failed"); + + dis->drs.ao = ao; + dis->drs.domid = domid; + dis->drs.callback = devices_destroy_cb; + dis->drs.force = 1; + libxl__devices_destroy(egc, &dis->drs); +} + static void devices_destroy_cb(libxl__egc *egc, libxl__devices_remove_state *drs, int rc) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index b147f3803c..f9e0bf6578 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1705,8 +1705,6 @@ _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 const libxl_vnc_info *libxl__dm_vnc(const libxl_domain_config *g_cfg); _hidden char *libxl__abs_path(libxl__gc *gc, const char *s, const char *path); @@ -3672,6 +3670,7 @@ extern const struct libxl_device_type *device_type_tbl[]; typedef struct libxl__domain_destroy_state libxl__domain_destroy_state; typedef struct libxl__destroy_domid_state libxl__destroy_domid_state; +typedef struct libxl__destroy_devicemodel_state libxl__destroy_devicemodel_state; typedef struct libxl__devices_remove_state libxl__devices_remove_state; typedef void libxl__domain_destroy_cb(libxl__egc *egc, @@ -3682,6 +3681,10 @@ typedef void libxl__domid_destroy_cb(libxl__egc *egc, libxl__destroy_domid_state *dis, int rc); +typedef void libxl__devicemodel_destroy_cb(libxl__egc *egc, + libxl__destroy_devicemodel_state *ddms, + int rc); + typedef void libxl__devices_remove_callback(libxl__egc *egc, libxl__devices_remove_state *drs, int rc); @@ -3697,6 +3700,14 @@ struct libxl__devices_remove_state { int num_devices; }; +struct libxl__destroy_devicemodel_state { + /* filled in by user */ + libxl__ao *ao; + uint32_t domid; + libxl__devicemodel_destroy_cb *callback; /* May be called re-entrantly */ + /* private to implementation */ +}; + struct libxl__destroy_domid_state { /* filled in by user */ libxl__ao *ao; @@ -3704,6 +3715,7 @@ struct libxl__destroy_domid_state { libxl__domid_destroy_cb *callback; /* private to implementation */ libxl__devices_remove_state drs; + libxl__destroy_devicemodel_state ddms; libxl__ev_child destroyer; bool soft_reset; }; @@ -3735,6 +3747,10 @@ _hidden void libxl__domain_destroy(libxl__egc *egc, _hidden void libxl__destroy_domid(libxl__egc *egc, libxl__destroy_domid_state *dis); +/* Used to detroy the device model */ +_hidden void libxl__destroy_device_model(libxl__egc *egc, + libxl__destroy_devicemodel_state *ddms); + /* Entry point for devices destruction */ _hidden void libxl__devices_destroy(libxl__egc *egc, libxl__devices_remove_state *drs); -- 2.19.2 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel