[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4] libxl: introduce LIBXL_DOMAIN_TYPE_INVALID
On Fri, 2012-05-25 at 11:26 +0100, Dario Faggioli wrote: > On Fri, 2012-05-25 at 10:44 +0100, Ian Campbell wrote: > > > diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c > > > --- a/tools/libxl/libxl_dm.c > > > +++ b/tools/libxl/libxl_dm.c > > > @@ -257,6 +257,10 @@ static char ** libxl__build_device_model > > > for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; > > > i++) > > > flexarray_append(dm_args, b_info->extra_hvm[i]); > > > break; > > > + case LIBXL_DOMAIN_TYPE_INVALID: > > > + LIBXL__LOG(CTX, LIBXL__LOG_ERROR, "invalid domain type"); > > > + flexarray_free(dm_args); > > > + return NULL; > > > > In some cases, like here, the code is entitled to assume that type is > > either PV or HVM, due to the checks in > > libxl__domain_build_info_setdefault. I think if we see an invalid here > > then that is an abort() worthy event. > > > As you wish, although it seems to me that this case above is the only > possible situation where we are returning NULL from that function. > Nevertheless, a NULL return value is handled and considered (and > propagated) as error by the caller. That's why, when Roger suggested > going this way (i.e., retuning NULL), I liked the idea very much and > went for it. > > That being said, I'm very very very few confident with these code paths, > so I'm just thought it might worth pointing the above out, but I'll > definitely cope with your request if you really thing this is they > correct thing o do. It would be a bug, similar to an assertion failure, to get to this point with b_info->type not equal to either PV or HVM. This comment about setdefault in libxl_internal.h explains why: * Idempotently sets any members of "p" which is currently set to * a special value indicating that the defaults should be used * (per libxl_<type>_init) to a specific value. * * All libxl API functions are expected to have arranged for this * to be called before using any values within these structures. so having arranged to call that function at the right time we can assume that type is a sensible value, and indeed setdefault makes this the case. > > There are a bunch of places where we look a b_info->type with if > > statements instead of switch. Plain ifs are ok, but it might be worth > > checking the ones with an else clause (not else if) too? I suspect in > > many cases they are entitled that !HVM == PV due to the setdefault > > thing. > > > > Right, and many of them I can take care of. Perhaps the problem is there > are some places where the event of libxl__domain_type "failing" (i.e., > returning something different from HVM or PV) is somewhat considered > impossible, or at least neglected, like this one here: > > int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, > uint32_t domid, int fd) > { > GC_INIT(ctx); > libxl_domain_type type = libxl__domain_type(gc, domid); > int live = info != NULL && info->flags & XL_SUSPEND_LIVE; > int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG; > int rc = 0; > > rc = libxl__domain_suspend_common(gc, domid, fd, type, live, debug, > /* No Remus */ NULL); > > if (!rc && type == LIBXL_DOMAIN_TYPE_HVM) > rc = libxl__domain_save_device_model(gc, domid, fd); > GC_FREE; > return rc; > } > > > Of course that can be right because of your argument about _sefdefault, > but I'm not sure how to make sure of that and what to do about them... > Thoughts? This one is OK, it doesn't have an else case... > > > On a related note, re what we where discussing yesterday on IRC about > putting a 'default' clause on those switches, there already is some > heterogeneity here. For example: > > > int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid) > { > ... > switch (libxl__domain_type(gc, domid)) { > case LIBXL_DOMAIN_TYPE_HVM: > ... > break; > case LIBXL_DOMAIN_TYPE_PV: > ... > break; > default: > abort(); This seems like it needs a TYPE_INVALID, since libxl__domain_type could legitimately return it. > } > ... > } > > or: > > int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) > { > ... > else { > switch (libxl__domain_type(gc, domid_vm)) { > case LIBXL_DOMAIN_TYPE_HVM: > ... > break; > case LIBXL_DOMAIN_TYPE_PV: > ... > break; > case LIBXL_DOMAIN_TYPE_INVALID: > ... > break; > default: > abort(); > } > ... > } > > Should we leave it like this? Is it worth/reasonable to convert all the > 'default:' into 'case LIBXL_DOMAIN_TYPE_INVALID:' (if yes, what do we do > with the places that have both? :O) ? Or perhaps vice versa? > > If we can gather consensus on an alternative, I can go ahead and put it > down all over the places... > > Thanks and Regards, > Dario > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |