[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] xen: write information about supported backends
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [PATCH] xen: write information about supported backends |
Date: |
Fri, 1 Apr 2016 15:56:33 +0100 (BST) |
User-agent: |
Alpine 2.10 (DEB 1266 2009-07-14) |
On Wed, 30 Mar 2016, Juergen Gross wrote:
> Add a Xenstore directory for each supported pv backend. This will allow
> Xen tools to decide which backend type to use in case there are
> multiple possibilities.
>
> The information is added under
> /local/domain/<backend-domid>/device-model/<domid>/backends
> before the "running" state is written to Xenstore. Using a directory
> for each directory enables us to add parameters for specific backends
> in the future.
>
> In order to reuse the Xenstore directory creation already present in
> hw/xen/xen_devconfig.c move the related functions to
> hw/xen/xen_backend.c where they fit better.
An interface change like this one, needs a new file under docs (in the
Xen repository) to document it. Please add a reference to it, in the
commit message here.
In addition please make sure that this can work with QEMU running as
non-root. What are the permissions of the new xenstore directory?
> Signed-off-by: Juergen Gross <address@hidden>
> ---
> hw/xen/xen_backend.c | 52
> ++++++++++++++++++++++++++++++++++++++++++++
> hw/xen/xen_devconfig.c | 52
> ++------------------------------------------
> include/hw/xen/xen_backend.h | 1 +
> 3 files changed, 55 insertions(+), 50 deletions(-)
>
> diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
> index 60575ad..8983440 100644
> --- a/hw/xen/xen_backend.c
> +++ b/hw/xen/xen_backend.c
> @@ -42,11 +42,35 @@ struct xs_handle *xenstore = NULL;
> const char *xen_protocol;
>
> /* private */
> +struct xs_dirs {
> + char *xs_dir;
> + QTAILQ_ENTRY(xs_dirs) list;
> +};
> +static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup =
> QTAILQ_HEAD_INITIALIZER(xs_cleanup);
> +
> static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs =
> QTAILQ_HEAD_INITIALIZER(xendevs);
> static int debug = 0;
>
> /* ------------------------------------------------------------- */
>
> +static void xenstore_cleanup_dir(char *dir)
> +{
> + struct xs_dirs *d;
> +
> + d = g_malloc(sizeof(*d));
> + d->xs_dir = dir;
> + QTAILQ_INSERT_TAIL(&xs_cleanup, d, list);
> +}
> +
> +void xen_config_cleanup(void)
> +{
> + struct xs_dirs *d;
> +
> + QTAILQ_FOREACH(d, &xs_cleanup, list) {
> + xs_rm(xenstore, 0, d->xs_dir);
> + }
> +}
> +
> int xenstore_write_str(const char *base, const char *node, const char *val)
> {
> char abspath[XEN_BUFSIZE];
> @@ -75,6 +99,28 @@ char *xenstore_read_str(const char *base, const char *node)
> return ret;
> }
>
> +int xenstore_mkdir(char *path, int p)
> +{
> + struct xs_permissions perms[2] = {{
> + .id = 0, /* set owner: dom0 */
> + },{
> + .id = xen_domid,
> + .perms = p,
> + }};
> +
> + if (!xs_mkdir(xenstore, 0, path)) {
> + xen_be_printf(NULL, 0, "xs_mkdir %s: failed\n", path);
> + return -1;
> + }
> + xenstore_cleanup_dir(g_strdup(path));
> +
> + if (!xs_set_permissions(xenstore, 0, path, perms, 2)) {
> + xen_be_printf(NULL, 0, "xs_set_permissions %s: failed\n", path);
> + return -1;
> + }
> + return 0;
> +}
> +
> int xenstore_write_int(const char *base, const char *node, int ival)
> {
> char val[12];
> @@ -726,6 +772,12 @@ err:
>
> int xen_be_register(const char *type, struct XenDevOps *ops)
> {
> + char path[50];
> +
> + snprintf(path, sizeof (path), "device-model/%u/backends/%s", xen_domid,
> + type);
> + xenstore_mkdir(path, XS_PERM_READ);
> +
> return xenstore_scan(type, xen_domid, ops);
> }
>
> diff --git a/hw/xen/xen_devconfig.c b/hw/xen/xen_devconfig.c
> index 1f30fe4..b7d290d 100644
> --- a/hw/xen/xen_devconfig.c
> +++ b/hw/xen/xen_devconfig.c
> @@ -5,54 +5,6 @@
>
> /* ------------------------------------------------------------- */
>
> -struct xs_dirs {
> - char *xs_dir;
> - QTAILQ_ENTRY(xs_dirs) list;
> -};
> -static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup =
> QTAILQ_HEAD_INITIALIZER(xs_cleanup);
> -
> -static void xen_config_cleanup_dir(char *dir)
> -{
> - struct xs_dirs *d;
> -
> - d = g_malloc(sizeof(*d));
> - d->xs_dir = dir;
> - QTAILQ_INSERT_TAIL(&xs_cleanup, d, list);
> -}
> -
> -void xen_config_cleanup(void)
> -{
> - struct xs_dirs *d;
> -
> - QTAILQ_FOREACH(d, &xs_cleanup, list) {
> - xs_rm(xenstore, 0, d->xs_dir);
> - }
> -}
> -
> -/* ------------------------------------------------------------- */
> -
> -static int xen_config_dev_mkdir(char *dev, int p)
> -{
> - struct xs_permissions perms[2] = {{
> - .id = 0, /* set owner: dom0 */
> - },{
> - .id = xen_domid,
> - .perms = p,
> - }};
> -
> - if (!xs_mkdir(xenstore, 0, dev)) {
> - xen_be_printf(NULL, 0, "xs_mkdir %s: failed\n", dev);
> - return -1;
> - }
> - xen_config_cleanup_dir(g_strdup(dev));
> -
> - if (!xs_set_permissions(xenstore, 0, dev, perms, 2)) {
> - xen_be_printf(NULL, 0, "xs_set_permissions %s: failed\n", dev);
> - return -1;
> - }
> - return 0;
> -}
> -
> static int xen_config_dev_dirs(const char *ftype, const char *btype, int
> vdev,
> char *fe, char *be, int len)
> {
> @@ -66,8 +18,8 @@ static int xen_config_dev_dirs(const char *ftype, const
> char *btype, int vdev,
> snprintf(be, len, "%s/backend/%s/%d/%d", dom, btype, xen_domid, vdev);
> free(dom);
>
> - xen_config_dev_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
> - xen_config_dev_mkdir(be, XS_PERM_READ);
> + xenstore_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
> + xenstore_mkdir(be, XS_PERM_READ);
> return 0;
> }
>
> diff --git a/include/hw/xen/xen_backend.h b/include/hw/xen/xen_backend.h
> index b4b4ff0..1bc5042 100644
> --- a/include/hw/xen/xen_backend.h
> +++ b/include/hw/xen/xen_backend.h
> @@ -63,6 +63,7 @@ extern const char *xen_protocol;
> extern DeviceState *xen_sysdev;
>
> /* xenstore helper functions */
> +int xenstore_mkdir(char *path, int p);
> int xenstore_write_str(const char *base, const char *node, const char *val);
> int xenstore_write_int(const char *base, const char *node, int ival);
> int xenstore_write_int64(const char *base, const char *node, int64_t ival);
> --
> 2.6.2
>
- Re: [Qemu-devel] [PATCH] xen: write information about supported backends,
Stefano Stabellini <=