[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 5/7] libxl: allow creation of domains with a specified or random domid
> -----Original Message----- > From: Ian Jackson <ian.jackson@xxxxxxxxxx> > Sent: 30 January 2020 17:26 > To: Durrant, Paul <pdurrant@xxxxxxxxxxxx> > Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; Wei Liu <wl@xxxxxxx>; Anthony Perard > <anthony.perard@xxxxxxxxxx>; Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; > George Dunlap <George.Dunlap@xxxxxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; > Julien Grall <julien@xxxxxxx>; Konrad Rzeszutek Wilk > <konrad.wilk@xxxxxxxxxx>; Stefano Stabellini <sstabellini@xxxxxxxxxx>; > Jason Andryuk <jandryuk@xxxxxxxxx> > Subject: Re: [PATCH v4 5/7] libxl: allow creation of domains with a > specified or random domid > > Paul Durrant writes ("[PATCH v4 5/7] libxl: allow creation of domains with > a specified or random domid"): > > This patch adds a 'domid' field to libxl_domain_create_info and then > > modifies libxl__domain_make() to have Xen use that value if it is valid. > > If the domid value is invalid then Xen will choose the domid, as before, > > unless the value is the new special RANDOM_DOMID value added to the API. > > This value instructs libxl__domain_make() to choose a random domid value > > for Xen to use. > > > > If Xen determines that a domid specified to or chosen by > > libxl__domain_make() co-incides with an existing domain then the create > > operation will fail. In this case, if RANDOM_DOMID was specified to > > libxl__domain_make() then a new random value will be chosen and the > create > > operation will be re-tried, otherwise libxl__domain_make() will fail. > > > > After Xen has successfully created a new domain, libxl__domain_make() > will > > check whether its domid matches any recently used domid values. If it > does > > then the domain will be destroyed. If the domid used in creation was > > specified to libxl__domain_make() then it will fail at this point, > > otherwise the create operation will be re-tried with either a new random > > or Xen-selected domid value. > ... > > - ret = xc_domain_create(ctx->xch, domid, &create); > > + if (libxl_domid_valid_guest(info->domid)) > > + *domid = info->domid; > > + > > + again: > > + for (;;) { > > + if (info->domid == RANDOM_DOMID) { > > + uint16_t v; > > + > > + ret = libxl__random_bytes(gc, (void *)&v, sizeof(v)); > > + if (ret < 0) > > + break; > > + > > + v &= DOMID_MASK; > > + if (!libxl_domid_valid_guest(v)) > > + continue; > > + > > + *domid = v; > > + } > > + > > + ret = xc_domain_create(ctx->xch, domid, &create); > > + if (ret == 0 || errno != EEXIST || info->domid != > RANDOM_DOMID) > > + break; > > + } > > + > > if (ret < 0) { > > LOGED(ERROR, *domid, "domain creation fail"); > > + *domid = INVALID_DOMID; > > + rc = ERROR_FAIL; > > + goto out; > > + } > > + > > + if (libxl__is_domid_recent(gc, *domid)) { > > + if (*domid == info->domid) /* domid was specified */ > > + LOGED(ERROR, *domid, "domain id recently used"); > > + > > + ret = xc_domain_destroy(ctx->xch, *domid); > > + if (!ret) { > > + *domid = INVALID_DOMID; > > + > > + /* If the domid was not specified then have another go > */ > > + if (!libxl_domid_valid_guest(info->domid)) > > + goto again; > > + } > > You have written this as two nested loops, one of which is implemented > as a goto, but actually logically this is surely only one loop ? > Please could you reorganise this and then I'll read it again... > Ok, I'll try to squash it down to one. It should be do-able. Paul > Thanks, > Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |