Ian Jackson
2010-Aug-23 16:59 UTC
[Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> --- tools/libxl/libxl.c | 31 +++++++++++++++++++++---------- tools/libxl/libxl_dom.c | 14 ++++++++++---- tools/libxl/libxl_pci.c | 14 ++++++++------ 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 6eb17e8..c31e6bf 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -427,9 +427,10 @@ out: int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid) { libxl_gc gc = LIBXL_INIT_GC(ctx); - int rc = 0; + int hvm, rc = 0; - if (is_hvm(ctx, domid)) { + hvm = is_hvm(ctx, domid); if (hvm<0) { rc = hvm; goto out; } + if (hvm) { XL_LOG(ctx, XL_LOG_DEBUG, "Called domain_resume on " "non-cooperative hvm domain %u", domid); rc = ERROR_NI; @@ -645,11 +646,13 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm) int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, uint32_t domid, int fd) { - int hvm = is_hvm(ctx, domid); + int hvm; int live = info != NULL && info->flags & XL_SUSPEND_LIVE; int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG; int rc = 0; + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; + core_suspend(ctx, domid, fd, hvm, live, debug); if (hvm) rc = save_device_model(ctx, domid, fd); @@ -685,9 +688,10 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) libxl_gc gc = LIBXL_INIT_GC(ctx); char *path; char *state; - int ret, rc = 0; + int hvm, ret, rc = 0; - if (is_hvm(ctx, domid)) { + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; + if (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")) { @@ -717,6 +721,7 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) libxl_gc gc = LIBXL_INIT_GC(ctx); char *shutdown_path; char *dom_path; + int hvm, rc = 0; if (req > ARRAY_SIZE(req_table)) { libxl_free_all(&gc); @@ -732,7 +737,8 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) shutdown_path = libxl_sprintf(&gc, "%s/control/shutdown", dom_path); xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req])); - if (is_hvm(ctx,domid)) { + hvm = is_hvm(ctx,domid); if (hvm<0) { rc = hvm; goto out; } + if (hvm) { unsigned long acpi_s_state = 0; unsigned long pvdriver = 0; int ret; @@ -754,8 +760,9 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) } } } + out: libxl_free_all(&gc); - return 0; + return rc; } int libxl_get_wait_fd(libxl_ctx *ctx, int *fd) @@ -920,9 +927,10 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force) libxl_gc gc = LIBXL_INIT_GC(ctx); char *dom_path; char *vm_path; - int rc, dm_present; + int rc, hvm, dm_present; - if (is_hvm(ctx, domid)) { + hvm = is_hvm(ctx, domid); if (hvm<0) { rc = hvm; goto out; } + if (hvm) { dm_present = 1; } else { char *pid; @@ -1004,11 +1012,14 @@ out: int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) { + int hvm; uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm); + if (stubdomid) return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV); else { - if (is_hvm(ctx, domid_vm)) + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; + if (hvm) return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL); else return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV); diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 1691858..a56e890 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -37,10 +37,16 @@ int is_hvm(libxl_ctx *ctx, uint32_t domid) int ret; ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info); - if (ret != 1) - return -1; - if (info.domain != domid) - return -1; + if (ret != 1) { + XL_LOG_ERRNO(ctx,XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist failed"); + return ERROR_FAIL; + } + if (info.domain != domid) { + XL_LOG(ctx, XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist gave info " + "for %"PRIu32"d when we asked for %"PRIu32"d", + info.domain, domid); + return ERROR_FAIL; + } return !!(info.flags & XEN_DOMINF_hvm_guest); } diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index f32db3b..8bcabb0 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -266,7 +266,7 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, uint32_t domid, libxl_dev libxl_ctx *ctx = libxl_gc_owner(gc); flexarray_t *back; char *num_devs, *be_path; - int num = 0; + int hvm, num = 0; unsigned int boffset = 0; xs_transaction_t t; @@ -275,7 +275,8 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, uint32_t domid, libxl_dev if (!num_devs) return libxl_create_pci_backend(gc, domid, pcidev, 1); - if (!is_hvm(ctx, domid)) { + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) return ERROR_FAIL; } @@ -330,7 +331,8 @@ static int libxl_device_pci_remove_xenstore(libxl_gc *gc, uint32_t domid, libxl_ return ERROR_INVAL; num = atoi(num_devs); - if (!is_hvm(ctx, domid)) { + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) { XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -358,7 +360,7 @@ retry_transaction: if (errno == EAGAIN) goto retry_transaction; - if (!is_hvm(ctx, domid)) { + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) { XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -610,7 +612,7 @@ static int do_pci_add(libxl_gc *gc, uint32_t domid, libxl_device_pci *pcidev) char *state, *vdevfn; int rc, hvm; - hvm = is_hvm(ctx, domid); + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; if (hvm) { if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) { return ERROR_FAIL; @@ -834,7 +836,7 @@ static int do_pci_remove(libxl_gc *gc, uint32_t domid, libxl_device_pci *pcidev) libxl_device_pci_remove_xenstore(gc, domid, pcidev); - hvm = is_hvm(ctx, domid); + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; if (hvm) { if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) { return ERROR_FAIL; -- 1.5.6.5 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Gianni Tedesco
2010-Aug-24 13:28 UTC
Re: [Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns
On Mon, 2010-08-23 at 17:59 +0100, Ian Jackson wrote:> Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> > --- > tools/libxl/libxl.c | 31 +++++++++++++++++++++---------- > tools/libxl/libxl_dom.c | 14 ++++++++++---- > tools/libxl/libxl_pci.c | 14 ++++++++------ > 3 files changed, 39 insertions(+), 20 deletions(-) > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index 6eb17e8..c31e6bf 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -427,9 +427,10 @@ out: > int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid) > { > libxl_gc gc = LIBXL_INIT_GC(ctx); > - int rc = 0; > + int hvm, rc = 0; > > - if (is_hvm(ctx, domid)) { > + hvm = is_hvm(ctx, domid); if (hvm<0) { rc = hvm; goto out; } > + if (hvm) { > XL_LOG(ctx, XL_LOG_DEBUG, "Called domain_resume on " > "non-cooperative hvm domain %u", domid); > rc = ERROR_NI; > @@ -645,11 +646,13 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm) > int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, > uint32_t domid, int fd) > { > - int hvm = is_hvm(ctx, domid); > + int hvm; > int live = info != NULL && info->flags & XL_SUSPEND_LIVE; > int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG; > int rc = 0; > > + hvm = is_hvm(ctx, domid); if (hvm<0) return hvm; > +I hate this coding style, it''s really easy to miss whats going on when scanning code and two things are done on one line. I think either lines ought to be added or change declaration to: int get_vm_mode(libxl_ctx, int domid, int *hvm); so at least compiler can tell you if you''re using it the way it was intended. Gianni _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Gianni Tedesco
2010-Aug-24 13:38 UTC
Re: [Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns
On Tue, 2010-08-24 at 14:40 +0100, Ian Jackson wrote:> Gianni Tedesco (3P) writes ("Re: [Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns"): > > I hate this coding style, it''s really easy to miss whats going on when > > scanning code and two things are done on one line. I think either lines > > ought to be added or change declaration to: > > > > int get_vm_mode(libxl_ctx, int domid, int *hvm); > > > > so at least compiler can tell you if you''re using it the way it was > > intended. > > I''d be happy with the latter proposal. I don''t like anything that > increases the code size. Shall I resend my patch ?Fair enough, yes please re-send. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2010-Aug-24 13:40 UTC
Re: [Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns
Gianni Tedesco (3P) writes ("Re: [Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns"):> I hate this coding style, it''s really easy to miss whats going on when > scanning code and two things are done on one line. I think either lines > ought to be added or change declaration to: > > int get_vm_mode(libxl_ctx, int domid, int *hvm); > > so at least compiler can tell you if you''re using it the way it was > intended.I''d be happy with the latter proposal. I don''t like anything that increases the code size. Shall I resend my patch ? Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2010-Aug-24 17:59 UTC
[Xen-devel] [PATCH] libxl: properly check errors from libxl__get_ishvm (v3)
Make is_hvm log on errors; make callers check its error returns; and rename the function according to the libxl__ name scheme for internal functions. Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> Cc: Jun Zhu <Jun.Zhu@citrix.com> Cc: Gianni Tedesco <gianni.tedesco@citrix.com> --- tools/libxl/libxl.c | 31 +++++++++++++++++++++---------- tools/libxl/libxl_dom.c | 19 +++++++++++++------ tools/libxl/libxl_internal.h | 2 +- tools/libxl/libxl_pci.c | 16 +++++++++------- 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 099d82e..0343f7e 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -427,9 +427,10 @@ out: int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid) { libxl_gc gc = LIBXL_INIT_GC(ctx); - int rc = 0; + int hvm, rc = 0; - if (is_hvm(ctx, domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) goto out; + if (hvm) { XL_LOG(ctx, XL_LOG_DEBUG, "Called domain_resume on " "non-cooperative hvm domain %u", domid); rc = ERROR_NI; @@ -645,11 +646,13 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm) int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, uint32_t domid, int fd) { - int hvm = is_hvm(ctx, domid); + int hvm; int live = info != NULL && info->flags & XL_SUSPEND_LIVE; int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG; int rc = 0; + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; + core_suspend(ctx, domid, fd, hvm, live, debug); if (hvm) rc = save_device_model(ctx, domid, fd); @@ -685,9 +688,10 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) libxl_gc gc = LIBXL_INIT_GC(ctx); char *path; char *state; - int ret, rc = 0; + int hvm, ret, rc = 0; - if (is_hvm(ctx, domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; + if (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")) { @@ -717,6 +721,7 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) libxl_gc gc = LIBXL_INIT_GC(ctx); char *shutdown_path; char *dom_path; + int hvm, rc = 0; if (req > ARRAY_SIZE(req_table)) { libxl_free_all(&gc); @@ -732,7 +737,8 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) shutdown_path = libxl_sprintf(&gc, "%s/control/shutdown", dom_path); xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req])); - if (is_hvm(ctx,domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) goto out; + if (hvm) { unsigned long acpi_s_state = 0; unsigned long pvdriver = 0; int ret; @@ -754,8 +760,9 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) } } } + out: libxl_free_all(&gc); - return 0; + return rc; } int libxl_get_wait_fd(libxl_ctx *ctx, int *fd) @@ -920,9 +927,10 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force) libxl_gc gc = LIBXL_INIT_GC(ctx); char *dom_path; char *vm_path; - int rc, dm_present; + int rc, hvm, dm_present; - if (is_hvm(ctx, domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) goto out; + if (hvm) { dm_present = 1; } else { char *pid; @@ -1004,11 +1012,14 @@ out: int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) { + int rc, hvm; uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm); + if (stubdomid) return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV); else { - if (is_hvm(ctx, domid_vm)) + rc = libxl__get_ishvm(ctx, domid_vm, &hvm); if (rc) return rc; + if (hvm) return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL); else return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV); diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 1691858..c45b694 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -31,17 +31,24 @@ #include "libxl.h" #include "libxl_internal.h" -int is_hvm(libxl_ctx *ctx, uint32_t domid) +int libxl__get_ishvm(libxl_ctx *ctx, uint32_t domid, int *is_hvm_r) { xc_domaininfo_t info; int ret; ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info); - if (ret != 1) - return -1; - if (info.domain != domid) - return -1; - return !!(info.flags & XEN_DOMINF_hvm_guest); + if (ret != 1) { + XL_LOG_ERRNO(ctx,XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist failed"); + return ERROR_FAIL; + } + if (info.domain != domid) { + XL_LOG(ctx, XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist gave info " + "for %"PRIu32"d when we asked for %"PRIu32"d", + info.domain, domid); + return ERROR_FAIL; + } + *is_hvm_r = !!(info.flags & XEN_DOMINF_hvm_guest); + return 0; } int get_shutdown_reason(libxl_ctx *ctx, uint32_t domid) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index face021..3f822d4 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -140,7 +140,7 @@ _hidden char *libxl_xs_read(libxl_gc *gc, xs_transaction_t t, char *path); _hidden char **libxl_xs_directory(libxl_gc *gc, xs_transaction_t t, char *path, unsigned int *nb); /* from xl_dom */ -_hidden int is_hvm(libxl_ctx *ctx, uint32_t domid); +_hidden int libxl__get_ishvm(libxl_ctx *ctx, uint32_t domid, int *is_hvm_r); _hidden int get_shutdown_reason(libxl_ctx *ctx, uint32_t domid); #define dominfo_get_shutdown_reason(info) (((info)->flags >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask) diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index f32db3b..cf7380c 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -266,7 +266,7 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, uint32_t domid, libxl_dev libxl_ctx *ctx = libxl_gc_owner(gc); flexarray_t *back; char *num_devs, *be_path; - int num = 0; + int rc, hvm, num = 0; unsigned int boffset = 0; xs_transaction_t t; @@ -275,7 +275,8 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, uint32_t domid, libxl_dev if (!num_devs) return libxl_create_pci_backend(gc, domid, pcidev, 1); - if (!is_hvm(ctx, domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) return ERROR_FAIL; } @@ -319,7 +320,7 @@ static int libxl_device_pci_remove_xenstore(libxl_gc *gc, uint32_t domid, libxl_ { libxl_ctx *ctx = libxl_gc_owner(gc); char *be_path, *num_devs_path, *num_devs, *xsdev, *tmp, *tmppath; - int num, i, j; + int num, i, j, rc, hvm; xs_transaction_t t; unsigned int domain = 0, bus = 0, dev = 0, func = 0; @@ -330,7 +331,8 @@ static int libxl_device_pci_remove_xenstore(libxl_gc *gc, uint32_t domid, libxl_ return ERROR_INVAL; num = atoi(num_devs); - if (!is_hvm(ctx, domid)) { + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) { XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -358,7 +360,7 @@ retry_transaction: if (errno == EAGAIN) goto retry_transaction; - if (!is_hvm(ctx, domid)) { + if (!hvm) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) { XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", be_path); return ERROR_FAIL; @@ -610,7 +612,7 @@ static int do_pci_add(libxl_gc *gc, uint32_t domid, libxl_device_pci *pcidev) char *state, *vdevfn; int rc, hvm; - hvm = is_hvm(ctx, domid); + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; if (hvm) { if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) { return ERROR_FAIL; @@ -834,7 +836,7 @@ static int do_pci_remove(libxl_gc *gc, uint32_t domid, libxl_device_pci *pcidev) libxl_device_pci_remove_xenstore(gc, domid, pcidev); - hvm = is_hvm(ctx, domid); + rc = libxl__get_ishvm(ctx, domid, &hvm); if (rc) return rc; if (hvm) { if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) { return ERROR_FAIL; -- 1.5.6.5 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel