[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxl: further fixups re LIBXL_DOMAIN_TYPE process
Here's another patch which needs to go on top of my async save/restore series. Ian. From: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Subject: [PATCH] libxl: further fixups re LIBXL_DOMAIN_TYPE * Abolish the macro LIBXL__DOMAIN_IS_TYPE which had incorrect error handlng. At every call site, replace it with an open-coded call to libxl_domain_type and check against LIBXL_DOMAIN_TYPE_INVALID. * This involves adding an `out:' to libxl_domain_unpause. * In libxl_domain_destroy and do_pci_add, do not `default: abort();' if the domain type cannot be found. Instead switch on LIBXL_DOMAIN_TYPE_INVALID specifically and do some actual error handling. * In libxl__primary_console_find, remove a spurious default clause from the domain type switch. * In libxl_domain_suspend (as reorganised) error check, check for LIBXL_DOMAIN_TYPE_INVALID and remove a pointless extra log message. Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl.c | 33 ++++++++++++++++++++++++--------- tools/libxl/libxl_internal.h | 5 +++-- tools/libxl/libxl_pci.c | 18 +++++++++++++----- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index a257902..cd2dbda 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -390,7 +390,13 @@ int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid, int suspend_cancel) goto out; } - if (LIBXL__DOMAIN_IS_TYPE(gc, domid, HVM)) { + libxl_domain_type type = libxl__domain_type(gc, domid); + if (type == LIBXL_DOMAIN_TYPE_INVALID) { + rc = ERROR_FAIL; + goto out; + } + + if (type == LIBXL_DOMAIN_TYPE_HVM) { rc = libxl__domain_resume_device_model(gc, domid); if (rc) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, @@ -723,8 +729,7 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t domid, int fd, int flags, int rc; libxl_domain_type type = libxl__domain_type(gc, domid); - if (type < 0) { - LOG(ERROR,"domain %"PRIu32": unable to determine domain type", domid); + if (type == LIBXL_DOMAIN_TYPE_INVALID) { rc = ERROR_FAIL; goto out_err; } @@ -789,7 +794,13 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) char *state; int ret, rc = 0; - if (LIBXL__DOMAIN_IS_TYPE(gc, domid, HVM)) { + libxl_domain_type type = libxl__domain_type(gc, domid); + if (type == LIBXL_DOMAIN_TYPE_INVALID) { + rc = ERROR_FAIL; + goto out; + } + + if (type == LIBXL_DOMAIN_TYPE_HVM) { path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid); state = libxl__xs_read(gc, XBT_NULL, path); if (state != NULL && !strcmp(state, "paused")) { @@ -803,6 +814,7 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain %d", domid); rc = ERROR_FAIL; } + out: GC_FREE; return rc; } @@ -814,7 +826,11 @@ int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid) unsigned long pvdriver = 0; int ret; - if (LIBXL__DOMAIN_IS_TYPE(gc, domid, PV)) + libxl_domain_type domtype = libxl__domain_type(gc, domid); + if (domtype == LIBXL_DOMAIN_TYPE_INVALID) + return ERROR_FAIL; + + if (domtype == LIBXL_DOMAIN_TYPE_PV) return 1; ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver); @@ -1214,8 +1230,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid) pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid)); dm_present = (pid != NULL); break; - default: - abort(); + case LIBXL_DOMAIN_TYPE_INVALID: + rc = ERROR_FAIL; + goto out; } dom_path = libxl__xs_get_dompath(gc, domid); @@ -1363,8 +1380,6 @@ static int libxl__primary_console_find(libxl_ctx *ctx, uint32_t domid_vm, case LIBXL_DOMAIN_TYPE_INVALID: rc = ERROR_INVAL; goto out; - default: - abort(); } } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index f9ee949..c9725a3 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -797,8 +797,7 @@ _hidden int libxl__domain_cpupool(libxl__gc *gc, uint32_t domid); _hidden libxl_scheduler libxl__domain_scheduler(libxl__gc *gc, uint32_t domid); _hidden int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_domain_sched_params *scparams); -#define LIBXL__DOMAIN_IS_TYPE(gc, domid, type) \ - libxl__domain_type((gc), (domid)) == LIBXL_DOMAIN_TYPE_##type + typedef struct { uint32_t store_port; uint32_t store_domid; @@ -841,7 +840,9 @@ _hidden int libxl__domain_resume_device_model(libxl__gc *gc, uint32_t domid); _hidden void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid); +/* returns 0 or 1, or a libxl error code */ _hidden int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid); + _hidden char * libxl__domain_pvcontrol_read(libxl__gc *gc, xs_transaction_t t, uint32_t domid); _hidden int libxl__domain_pvcontrol_write(libxl__gc *gc, xs_transaction_t t, diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index de1b79f..81438be 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -128,7 +128,11 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_d if (!num_devs) return libxl__create_pci_backend(gc, domid, pcidev, 1); - if (!starting && LIBXL__DOMAIN_IS_TYPE(gc, domid, PV)) { + libxl_domain_type domtype = libxl__domain_type(gc, domid); + if (domtype == LIBXL_DOMAIN_TYPE_INVALID) + return ERROR_FAIL; + + if (!starting && domtype == LIBXL_DOMAIN_TYPE_PV) { if (libxl__wait_for_backend(gc, be_path, "4") < 0) return ERROR_FAIL; } @@ -171,7 +175,11 @@ static int libxl__device_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, libx return ERROR_INVAL; num = atoi(num_devs); - if (LIBXL__DOMAIN_IS_TYPE(gc, domid, PV)) { + libxl_domain_type domtype = libxl__domain_type(gc, domid); + if (domtype == LIBXL_DOMAIN_TYPE_INVALID) + return ERROR_FAIL; + + if (domtype == LIBXL_DOMAIN_TYPE_PV) { if (libxl__wait_for_backend(gc, be_path, "4") < 0) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -199,7 +207,7 @@ retry_transaction: if (errno == EAGAIN) goto retry_transaction; - if (LIBXL__DOMAIN_IS_TYPE(gc, domid, PV)) { + if (domtype == LIBXL_DOMAIN_TYPE_PV) { if (libxl__wait_for_backend(gc, be_path, "4") < 0) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -939,8 +947,8 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i } break; } - default: - abort(); + case LIBXL_DOMAIN_TYPE_INVALID: + return ERROR_FAIL; } out: if (!libxl_is_stubdom(ctx, domid, NULL)) { -- tg: (966769c..) t/xen/xl.domain-type-fixups-v2 (depends on: t/xen/xl.ao.progress-ignored-free-event) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |