[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] libxl: Make killing of device model asynchronous
commit 6a05c1a9b624f54b3687087829a25503088d1be5 Author: George Dunlap <george.dunlap@xxxxxxxxxx> AuthorDate: Fri Dec 21 15:41:08 2018 +0000 Commit: George Dunlap <george.dunlap@xxxxxxxxxx> CommitDate: Fri Dec 21 18:41:56 2018 +0000 libxl: Make killing of device model asynchronous 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.dunlap@xxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- 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 450433452d..ca59df33fe 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -2696,19 +2696,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); -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |