-----Original Message-----
From: jandr...@gmail.com <jandr...@gmail.com>
Sent: 13 January 2020 16:16
To: Durrant, Paul <pdurr...@amazon.co.uk>
Cc: xen-devel <xen-devel@lists.xenproject.org>; Anthony PERARD
<anthony.per...@citrix.com>; Ian Jackson <ian.jack...@eu.citrix.com>; Wei
Liu <w...@xen.org>
Subject: Re: [Xen-devel] [PATCH v2 4/6] libxl: allow creation of domains
with a specified or random domid
On Thu, Jan 9, 2020 at 6:50 AM Paul Durrant <pdurr...@amazon.com> wrote:
This patch adds a 'domid' field to libxl_domain_create_info and then
modifies do_domain_create() to use that value if it is valid. Any valid
domid will be checked against the retired domid list before being passed
to libxl__domain_make().
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 select a random domid
value,
check it for validity, verify it does not match a retired domain, and
then
pass it to Xen's XEN_DOMCTL_createdomain operation. If Xen determines
that
it co-incides with an existing domain, a new random value will be
selected and the operation will be re-tried.
NOTE: libxl__logv() is also modified to only log valid domid values in
messages rather than any domid, valid or otherwise, that is not
INVALID_DOMID.
Signed-off-by: Paul Durrant <pdurr...@amazon.com>
---
Cc: Ian Jackson <ian.jack...@eu.citrix.com>
Cc: Wei Liu <w...@xen.org>
Cc: Anthony PERARD <anthony.per...@citrix.com>
v2:
- Re-worked to use a value from libxl_domain_create_info
---
tools/libxl/libxl.h | 9 +++++++++
tools/libxl/libxl_create.c | 32 +++++++++++++++++++++++++++++++-
tools/libxl/libxl_internal.c | 2 +-
tools/libxl/libxl_types.idl | 1 +
4 files changed, 42 insertions(+), 2 deletions(-)
<snip>
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 1835a5502c..ee76dee364 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -600,9 +600,39 @@ int libxl__domain_make(libxl__gc *gc,
libxl_domain_config *d_config,
goto out;
}
- ret = xc_domain_create(ctx->xch, domid, &create);
+ if (libxl_domid_valid_guest(info->domid)) {
+ *domid = info->domid;
+
+ if (libxl__is_retired_domid(gc, *domid)) {
+ LOGED(ERROR, *domid, "domain id is retired");
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ } else if (info->domid == RANDOM_DOMID) {
+ *domid = 0; /* Zero-out initial value */
+ }
+
+ for (;;) {
+ if (info->domid == RANDOM_DOMID) {
+ /* Randomize lower order bytes */
+ ret = libxl__random_bytes(gc, (void *)domid,
+ sizeof(uint16_t));
Casting to void * assumes little endian.