WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in libxl_devic

To: Ian Campbell <ian.campbell@xxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore
From: Roger Pau Monné <roger.pau@xxxxxxxxxxxxx>
Date: Fri, 7 Oct 2011 14:18:12 +0200
Cc: Jonathan Ludlam <Jonathan.Ludlam@xxxxxxxxxxxxx>, Jim Fehlig <jfehlig@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx, Mike McClurg <mike.mcclurg@xxxxxxxxxx>, Dave Scott <Dave.Scott@xxxxxxxxxxxxx>
Delivery-date: Fri, 07 Oct 2011 05:20:08 -0700
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=K/gJWrzPDYtr4LTtZ/uKUB/YrcuE+4jddxYeeJDWI8A=; b=UMyi88rTplLIsWBGqpdj8pN3C4keNsYgPbTkyjQQvkEhWjoLM12mDugAa558Ba1dQ9 KLThjRE/VTjEyUglG7VsQBy26wPP7J7t4rXueBXZdKaJJawaXtIgc3PJDZgyfLql7SXY rJF43q5k0ArBPeFUfgtxXym2wyJ71uoiDnmbY=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <ec28ee6dace513c3d009.1317389607@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1317389593@xxxxxxxxxxxxxxxxxxxxx> <ec28ee6dace513c3d009.1317389607@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
2011/9/30 Ian Campbell <ian.campbell@xxxxxxxxxx>:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1317389248 -3600
> # Node ID ec28ee6dace513c3d009d498341f9537a19b2d98
> # Parent  e5a70a3b61a1acfa7d73db548a591486024d01b7
> libxl: use libxl__device in libxl_devices_destroy and 
> libxl__device_pci_remove_xenstore
>
> Doing this allows us to use the common functions for removing devices.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c        Fri Sep 30 14:27:28 2011 +0100
> +++ b/tools/libxl/libxl_device.c        Fri Sep 30 14:27:28 2011 +0100
> @@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__
>                           device->domid, device->devid);
>  }
>
> +int libxl__parse_backend_path(libxl__gc *gc,
> +                              const char *path,
> +                              libxl__device *dev)
> +{
> +    /* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */
> +    char strkind[16]; /* Longest is actually "console" */
> +    uint32_t domain;
> +    int rc = sscanf(path, "/local/domain/%d/backend/%15[^/]/%d/%d",
> +                    &dev->backend_domid,
> +                    strkind,
> +                    &domain,
> +                    &dev->backend_devid);
> +
> +    if (rc != 4)
> +        return ERROR_FAIL;
> +
> +    return libxl__device_kind_from_string(strkind, &dev->backend_kind);
> +}
> +
>  int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
>                              char **bents, char **fents)
>  {
> @@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const
>     return -1;
>  }
>
> -int libxl__device_remove(libxl__gc *gc, char *be_path)
> +int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
>  {
>     libxl_ctx *ctx = libxl__gc_owner(gc);
>     xs_transaction_t t;
> +    char *be_path = libxl__device_backend_path(gc, dev);
>     char *state_path = libxl__sprintf(gc, "%s/state", be_path);
>     char *state = libxl__xs_read(gc, XBT_NULL, state_path);
>     int rc = 0;
> @@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g
>  int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
>  {
>     libxl_ctx *ctx = libxl__gc_owner(gc);
> -    char *path, *be_path, *fe_path;
> +    char *path;
>     unsigned int num1, num2;
>     char **l1 = NULL, **l2 = NULL;
>     int i, j, n_watches = 0;
> +    libxl__device dev;
> +    libxl__device_kind kind;
>
>     path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
>     l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
> @@ -445,22 +467,27 @@ int libxl__devices_destroy(libxl__gc *gc
>         num1 = 0;
>     }
>     for (i = 0; i < num1; i++) {
> -        if (!strcmp("vfs", l1[i]))
> +        if (libxl__device_kind_from_string(l1[i], &kind))
> +            continue;
> +        if (kind == LIBXL__DEVICE_KIND_VBD)
>             continue;

This should not be there, or hotplug scripts for VBD device types are
not called. I know Linux doesn't need to call hotplug scripts for VBD,
but NetBSD does. Should we add some kind of helper function or ifdef,
or is it safe to remove this and handle VBD devices normally?

>         path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
>         l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
>         if (!l2)
>             continue;
>         for (j = 0; j < num2; j++) {
> -            fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", 
> domid, l1[i], l2[j]);
> -            be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, 
> "%s/backend", fe_path));
> -            if (be_path != NULL) {
> +            path = libxl__sprintf(gc, 
> "/local/domain/%d/device/%s/%s/backend",
> +                                  domid, l1[i], l2[j]);
> +            path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
> +            if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
> +                dev.domid = domid;
> +                dev.kind = kind;
> +                dev.devid = atoi(l2[j]);
> +
>                 if (force) {
> -                    xs_rm(ctx->xsh, XBT_NULL, be_path);
> -                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
> -                    libxl__device_destroy_tapdisk(gc, be_path);
> +                    libxl__device_force_remove(gc, &dev);
>                 } else {
> -                    if (libxl__device_remove(gc, be_path) > 0)
> +                    if (libxl__device_remove(gc, &dev) > 0)
>                         n_watches++;
>                 }
>             }
> @@ -468,14 +495,18 @@ int libxl__devices_destroy(libxl__gc *gc
>     }
>
>     /* console 0 frontend directory is not under /local/domain/<domid>/device 
> */
> -    fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
> -    be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", 
> fe_path));
> -    if (be_path && strcmp(be_path, "")) {
> +    path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid);
> +    path = libxl__xs_read(gc, XBT_NULL, path);
> +    if (path && strcmp(path, "") &&
> +        libxl__parse_backend_path(gc, path, &dev) == 0) {
> +        dev.domid = domid;
> +        dev.kind = LIBXL__DEVICE_KIND_CONSOLE;
> +        dev.devid = 0;
> +
>         if (force) {
> -            xs_rm(ctx->xsh, XBT_NULL, be_path);
> -            xs_rm(ctx->xsh, XBT_NULL, fe_path);
> +            libxl__device_force_remove(gc, &dev);
>         } else {
> -            if (libxl__device_remove(gc, be_path) > 0)
> +            if (libxl__device_remove(gc, &dev) > 0)
>                 n_watches++;
>         }
>     }
> @@ -505,12 +536,9 @@ int libxl__device_del(libxl__gc *gc, lib
>  {
>     libxl_ctx *ctx = libxl__gc_owner(gc);
>     struct timeval tv;
> -    char *backend_path;
>     int rc;
>
> -    backend_path = libxl__device_backend_path(gc, dev);
> -
> -    rc = libxl__device_remove(gc, backend_path);
> +    rc = libxl__device_remove(gc, dev);
>     if (rc == -1) {
>         rc = ERROR_FAIL;
>         goto out;
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:28 2011 +0100
> +++ b/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:28 2011 +0100
> @@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li
>                              char **bents, char **fents);
>  _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device 
> *device);
>  _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device 
> *device);
> +_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
> +                                      libxl__device *dev);
>  _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> -_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
> +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
>  _hidden int libxl__device_force_remove(libxl__gc *gc, libxl__device *dev);
>  _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
>  _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char 
> *state);
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_pci.c
> --- a/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:28 2011 +0100
> +++ b/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:28 2011 +0100
> @@ -410,9 +410,15 @@ retry_transaction2:
>             goto retry_transaction2;
>
>     if (num == 1) {
> -        char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, 
> "%s/frontend", be_path));
> -        xs_rm(ctx->xsh, XBT_NULL, be_path);
> -        xs_rm(ctx->xsh, XBT_NULL, fe_path);
> +        libxl__device dev;
> +        if (libxl__parse_backend_path(gc, be_path, &dev) != 0)
> +            return ERROR_FAIL;
> +
> +        dev.domid = domid;
> +        dev.kind = LIBXL__DEVICE_KIND_PCI;
> +        dev.devid = 0;
> +
> +        libxl__device_force_remove(gc, &dev);
>         return 0;
>     }
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>