From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: wei.liu2@citrix.com, Ian.Jackson@eu.citrix.com,
Ian.Campbell@citrix.com,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [PATCH v5 4/6] libxl: change xs path for QEMU
Date: Thu, 23 Jul 2015 18:27:42 +0100 [thread overview]
Message-ID: <1437672464-29909-4-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1507231824100.28668@kaball.uk.xensource.com>
Change the QEMU xenstore watch path to
/local/domain/$LIBXL_TOOLSTACK_DOMID/device-model/$DOMID/$EMULATOR_ID.
Currently two emulator_ids are statically allocated: one for device models and
one for pv qemus.
Add a parameter to libxl__device_model_xs_path to distinguish the device
model from the pv backends provider.
Store the device model binary path under
/local/domain/$DOMID/device-model on xenstore, so that we can fetch it
later and retrieve the list of supported options from
/local/domain/$LIBXL_TOOLSTACK_DOMID/libxl/$device_model_binary,
introduce in the previous path.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
Changes in v4:
- update xenstore-paths.markdown
Changes in v3:
- use LIBXL_TOOLSTACK_DOMID instead of 0 in the commit message
- change xs path to include the emulator_id
---
docs/misc/xenstore-paths.markdown | 16 +++++++++++-----
tools/libxl/libxl.c | 2 +-
tools/libxl/libxl_create.c | 3 +++
tools/libxl/libxl_device.c | 2 +-
tools/libxl/libxl_dm.c | 18 ++++++++++--------
tools/libxl/libxl_dom.c | 12 ++++++------
tools/libxl/libxl_internal.c | 19 +++++++++++++++----
tools/libxl/libxl_internal.h | 5 ++---
tools/libxl/libxl_pci.c | 14 +++++++-------
9 files changed, 56 insertions(+), 35 deletions(-)
diff --git a/docs/misc/xenstore-paths.markdown b/docs/misc/xenstore-paths.markdown
index 99e038b..e6ed25f 100644
--- a/docs/misc/xenstore-paths.markdown
+++ b/docs/misc/xenstore-paths.markdown
@@ -115,6 +115,10 @@ The domain's own ID.
The process ID of the device model associated with this domain, if it
has one.
+#### ~/device-model = STRING [n,INTERNAL]
+
+The full device model binary path.
+
#### ~/cpu/[0-9]+/availability = ("online"|"offline") [PV]
One node for each virtual CPU up to the guest's configured
@@ -306,13 +310,15 @@ A virtual network device backend. Described by
A PV console backend. Described in [console.txt](console.txt)
-#### ~/device-model/$DOMID/* [w]
+#### ~/device-model/$DOMID/$EMULATOR_ID/* [w]
Information relating to device models running in the domain. $DOMID is
-the target domain of the device model. When the device model is running
-at the same privilege level of the guest domain, this path does not
-contain any sensitive information and becomes guest writeable. Otherwise
-it is INTERNAL.
+the target domain of the device model. $EMULATOR_ID indentifies a
+specific device model instance (multiple device model instances for the
+same domain are possible). When the device model is running at the same
+privilege level of the guest domain, this path does not contain any
+sensitive information and becomes guest writeable. Otherwise
+it is INTERNAL
#### ~/libxl/disable_udev = ("1"|"0") []
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 516713e..bca4c88 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1035,7 +1035,7 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
if (type == LIBXL_DOMAIN_TYPE_HVM) {
uint32_t dm_domid = libxl_get_stubdom_id(ctx, domid);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
state = libxl__xs_read(gc, XBT_NULL, path);
if (state != NULL && !strcmp(state, "paused")) {
libxl__qemu_traditional_cmd(gc, domid, "continue");
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index a74b340..df946e2 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -1002,6 +1002,9 @@ static void domcreate_bootloader_done(libxl__egc *egc,
return;
}
+ libxl__xs_write(gc, XBT_NULL, GCSPRINTF("/local/domain/%u/device-model", domid),
+ "%s", libxl__domain_device_model(gc, info));
+
/* consume bootloader outputs. state->pv_{kernel,ramdisk} have
* been initialised by the bootloader already.
*/
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 93bb41e..aadcd08 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -1190,7 +1190,7 @@ int libxl__wait_for_device_model_deprecated(libxl__gc *gc,
char *path;
uint32_t dm_domid = libxl_get_stubdom_id(CTX, domid);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
return libxl__xenstore_child_wait_deprecated(gc, domid,
LIBXL_DEVICE_MODEL_START_TIMEOUT,
"Device Model", path, state, spawning,
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 99e2553..8bd7b82 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1272,9 +1272,9 @@ void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss)
retry_transaction:
t = xs_transaction_start(ctx->xsh);
xs_mkdir(ctx->xsh, t,
- libxl__device_model_xs_path(gc, dm_domid, guest_domid, ""));
+ libxl__device_model_xs_path(gc, false, dm_domid, guest_domid, ""));
xs_set_permissions(ctx->xsh, t,
- libxl__device_model_xs_path(gc, dm_domid,
+ libxl__device_model_xs_path(gc, false, dm_domid,
guest_domid, ""),
perm, ARRAY_SIZE(perm));
if (!xs_transaction_end(ctx->xsh, t, 0))
@@ -1435,7 +1435,7 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
sdss->xswait.what = GCSPRINTF("Stubdom %u for %u startup",
dm_domid, sdss->dm.guest_domid);
sdss->xswait.path =
- libxl__device_model_xs_path(gc, dm_domid, sdss->dm.guest_domid,
+ libxl__device_model_xs_path(gc, true, dm_domid, sdss->dm.guest_domid,
"/state");
sdss->xswait.timeout_ms = LIBXL_STUBDOM_START_TIMEOUT * 1000;
sdss->xswait.callback = stubdom_xswait_cb;
@@ -1571,7 +1571,8 @@ void libxl__spawn_local_dm(libxl__egc *egc, libxl__dm_spawn_state *dmss)
free(path);
}
- path = libxl__device_model_xs_path(gc, LIBXL_TOOLSTACK_DOMID, domid, "");
+ path = libxl__device_model_xs_path(gc, b_info->type == LIBXL_DOMAIN_TYPE_PV,
+ LIBXL_TOOLSTACK_DOMID, domid, "");
if (b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN &&
libxl__check_qemu_supported(gc, dm, "xsrestrict")) {
rwperm[0].id = LIBXL_TOOLSTACK_DOMID;
@@ -1629,8 +1630,9 @@ retry_transaction:
LIBXL__LOG(CTX, XTL_DEBUG, " %s", *arg);
spawn->what = GCSPRINTF("domain %d device model", domid);
- spawn->xspath = libxl__device_model_xs_path(gc, LIBXL_TOOLSTACK_DOMID,
- domid, "/state");
+ spawn->xspath = libxl__device_model_xs_path(gc,
+ b_info->type == LIBXL_DOMAIN_TYPE_PV, LIBXL_TOOLSTACK_DOMID,
+ domid, "/state");
spawn->timeout_ms = LIBXL_DEVICE_MODEL_START_TIMEOUT * 1000;
spawn->pidpath = GCSPRINTF("%s/image/device-model-pid", dom_path);
spawn->midproc_cb = libxl__spawn_record_pid;
@@ -1763,7 +1765,7 @@ void libxl__spawn_qdisk_backend(libxl__egc *egc, libxl__dm_spawn_state *dmss)
dmss->build_state->saved_state = 0;
dmss->spawn.what = GCSPRINTF("domain %u Qdisk backend", domid);
- dmss->spawn.xspath = GCSPRINTF("device-model/%u/state", domid);
+ dmss->spawn.xspath = libxl__device_model_xs_path(gc, true, 0, domid, "/state");
dmss->spawn.timeout_ms = LIBXL_DEVICE_MODEL_START_TIMEOUT * 1000;
/*
* We cannot save Qemu pid anywhere in the xenstore guest dir,
@@ -1846,7 +1848,7 @@ out:
int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)
{
- char *path = libxl__device_model_xs_path(gc, LIBXL_TOOLSTACK_DOMID,
+ char *path = libxl__device_model_xs_path(gc, false, LIBXL_TOOLSTACK_DOMID,
domid, "");
if (!xs_rm(CTX->xsh, XBT_NULL, path))
LOG(ERROR, "xs_rm failed for %s", path);
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index c8523da..a2bf33b 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -1016,7 +1016,7 @@ int libxl__qemu_traditional_cmd(libxl__gc *gc, uint32_t domid,
{
char *path = NULL;
uint32_t dm_domid = libxl_get_stubdom_id(CTX, domid);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/command");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/command");
return libxl__xs_write(gc, XBT_NULL, path, "%s", cmd);
}
@@ -1034,7 +1034,7 @@ static inline char *restore_helper(libxl__gc *gc, uint32_t dm_domid,
uint32_t domid,
uint64_t phys_offset, char *node)
{
- return libxl__device_model_xs_path(gc, dm_domid, domid,
+ return libxl__device_model_xs_path(gc, false, dm_domid, domid,
"/physmap/%"PRIx64"/%s",
phys_offset, node);
}
@@ -1146,9 +1146,9 @@ static void domain_suspend_switch_qemu_xen_traditional_logdirty
if (!lds->cmd_path) {
uint32_t dm_domid = libxl_get_stubdom_id(CTX, domid);
- lds->cmd_path = libxl__device_model_xs_path(gc, dm_domid, domid,
+ lds->cmd_path = libxl__device_model_xs_path(gc, false, dm_domid, domid,
"/logdirty/cmd");
- lds->ret_path = libxl__device_model_xs_path(gc, dm_domid, domid,
+ lds->ret_path = libxl__device_model_xs_path(gc, false, dm_domid, domid,
"/logdirty/ret");
}
lds->cmd = enable ? "enable" : "disable";
@@ -1672,7 +1672,7 @@ static inline char *physmap_path(libxl__gc *gc, uint32_t dm_domid,
uint32_t domid,
char *phys_offset, char *node)
{
- return libxl__device_model_xs_path(gc, dm_domid, domid,
+ return libxl__device_model_xs_path(gc, false, dm_domid, domid,
"/physmap/%s/%s",
phys_offset, node);
}
@@ -1696,7 +1696,7 @@ int libxl__toolstack_save(uint32_t domid, uint8_t **buf,
dm_domid = libxl_get_stubdom_id(CTX, domid);
entries = libxl__xs_directory(gc, 0,
- libxl__device_model_xs_path(gc, dm_domid, domid, "/physmap"),
+ libxl__device_model_xs_path(gc, false, dm_domid, domid, "/physmap"),
&num);
count = num;
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index c2c67bd..5836742 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -567,14 +567,25 @@ void libxl__update_domain_configuration(libxl__gc *gc,
dst->b_info.video_memkb = src->b_info.video_memkb;
}
-char *libxl__device_model_xs_path(libxl__gc *gc, uint32_t dm_domid,
+char *libxl__device_model_xs_path(libxl__gc *gc, bool pvqemu, uint32_t dm_domid,
uint32_t domid, const char *format, ...)
{
char *s, *fmt;
va_list ap;
-
- fmt = GCSPRINTF("/local/domain/%u/device-model/%u%s", dm_domid,
- domid, format);
+ char *dm;
+ int emulator_id = 0;
+
+ dm = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("/local/domain/%u/device-model", domid));
+ if (dm)
+ emulator_id = libxl__check_qemu_supported(gc, dm, "emulator_id");
+
+ if (!emulator_id) {
+ fmt = GCSPRINTF("/local/domain/%u/device-model/%u%s", dm_domid,
+ domid, format);
+ } else {
+ fmt = GCSPRINTF("/local/domain/%u/device-model/%u/%u%s", dm_domid,
+ domid, pvqemu ? QEMU_XEN_PV_ID : QEMU_XEN_DEVICE_MODEL_ID, format);
+ }
va_start(ap, format);
s = libxl__vsprintf(gc, fmt, ap);
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index b4bae2f..e15cdc7 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1830,9 +1830,8 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc_opt, const char *s);
_hidden int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid);
/* Return the system-wide default device model */
_hidden libxl_device_model_version libxl__default_device_model(libxl__gc *gc);
-_hidden char *libxl__device_model_xs_path(libxl__gc *gc, uint32_t dm_domid,
- uint32_t domid,
- const char *format, ...) PRINTF_ATTRIBUTE(4, 5);
+_hidden char *libxl__device_model_xs_path(libxl__gc *gc, bool pvqemu, uint32_t dm_domid,
+ uint32_t domid, const char *format, ...);
/* Check how executes hotplug script currently */
int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t);
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index e0743f8..07f6209 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -853,9 +853,9 @@ static int qemu_pci_add_xenstore(libxl__gc *gc, uint32_t domid,
uint32_t dm_domid;
dm_domid = libxl_get_stubdom_id(CTX, domid);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
state = libxl__xs_read(gc, XBT_NULL, path);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/parameter");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/parameter");
if (pcidev->vdevfn) {
libxl__xs_write(gc, XBT_NULL, path, PCI_BDF_VDEVFN","PCI_OPTIONS,
pcidev->domain, pcidev->bus, pcidev->dev,
@@ -870,9 +870,9 @@ static int qemu_pci_add_xenstore(libxl__gc *gc, uint32_t domid,
libxl__qemu_traditional_cmd(gc, domid, "pci-ins");
rc = libxl__wait_for_device_model_deprecated(gc, domid, NULL, NULL,
pci_ins_check, state);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/parameter");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/parameter");
vdevfn = libxl__xs_read(gc, XBT_NULL, path);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
if ( rc < 0 )
LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
"qemu refused to add device: %s", vdevfn);
@@ -1178,9 +1178,9 @@ static int qemu_pci_remove_xenstore(libxl__gc *gc, uint32_t domid,
dm_domid = libxl_get_stubdom_id(CTX, domid);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
state = libxl__xs_read(gc, XBT_NULL, path);
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/parameter");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/parameter");
libxl__xs_write(gc, XBT_NULL, path, PCI_BDF, pcidev->domain,
pcidev->bus, pcidev->dev, pcidev->func);
@@ -1198,7 +1198,7 @@ static int qemu_pci_remove_xenstore(libxl__gc *gc, uint32_t domid,
return ERROR_FAIL;
}
}
- path = libxl__device_model_xs_path(gc, dm_domid, domid, "/state");
+ path = libxl__device_model_xs_path(gc, false, dm_domid, domid, "/state");
xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
return 0;
--
1.7.10.4
next prev parent reply other threads:[~2015-07-23 17:27 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-23 17:26 [PATCH v5 0/6] libxl: xs_restrict QEMU Stefano Stabellini
2015-07-23 17:27 ` [PATCH v5 1/6] libxl: do not add a vkb backend to hvm guests Stefano Stabellini
2015-07-24 8:01 ` Paul Durrant
2015-07-24 10:21 ` Stefano Stabellini
2015-07-24 10:31 ` Paul Durrant
2015-07-24 10:56 ` Stefano Stabellini
2015-07-24 11:10 ` Ian Campbell
2015-07-24 11:12 ` Ian Jackson
2015-07-24 11:29 ` Stefano Stabellini
2015-07-24 11:39 ` Ian Campbell
2015-07-24 11:12 ` Paul Durrant
2015-07-24 12:04 ` Stefano Stabellini
2015-07-24 14:10 ` Stefano Stabellini
2015-07-24 14:13 ` Paul Durrant
2015-07-24 10:45 ` Fabio Fantoni
2015-07-23 17:27 ` [PATCH v5 2/6] [WIP] libxl: xsrestrict QEMU Stefano Stabellini
2015-07-23 17:27 ` [PATCH v5 3/6] libxl: allow /local/domain/$LIBXL_TOOLSTACK_DOMID/device-model/$DOMID to be written by $DOMID Stefano Stabellini
2015-07-23 17:27 ` Stefano Stabellini [this message]
2015-07-23 17:27 ` [PATCH v5 5/6] libxl: change qdisk-backend-pid path on xenstore Stefano Stabellini
2015-07-23 17:27 ` [PATCH v5 6/6] libxl: spawns two QEMUs for HVM guests Stefano Stabellini
2015-07-27 11:08 ` [PATCH v5 0/6] libxl: xs_restrict QEMU Fabio Fantoni
2015-07-29 9:21 ` Stefano Stabellini
2015-07-29 9:33 ` Fabio Fantoni
2015-07-29 9:36 ` Stefano Stabellini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1437672464-29909-4-git-send-email-stefano.stabellini@eu.citrix.com \
--to=stefano.stabellini@eu.citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).