xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: Roger Pau Monne <roger.pau@citrix.com>, xen-devel@lists.xenproject.org
Cc: Alex Velazquez <alex.j.velazquez@gmail.com>,
	Wei Liu <wei.liu2@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>
Subject: Re: [PATCH v2 for-4.6 1/2] libxl: fix devd removal path
Date: Wed, 23 Sep 2015 12:08:42 +0100	[thread overview]
Message-ID: <1443006522.10338.228.camel@citrix.com> (raw)
In-Reply-To: <1443002816-95720-2-git-send-email-roger.pau@citrix.com>

On Wed, 2015-09-23 at 12:06 +0200, Roger Pau Monne wrote:
> The current flow of the devd helper (in charge of launching hotplug
> scripts
> inside of driver domains) is to wait for the device backend to switch to
> state 6  (XenbusStateClosed) and then remove it. This is not correct,
> since
> a domain can reconnect it's PV devices as many times as it wants.
> 
> In order to fix this, introduce the following logic: the control domain
> will
> set the "online" backend node to 0 when it wants the driver domain to
> disconnect the device, so now the condition applied in devd is that
> "state"
> must be 6 and "online" 0 in order to proceed with the disconnection.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> Reported-by: Alex Velazquez <alex.j.velazquez@gmail.com>
> Cc: Alex Velazquez <alex.j.velazquez@gmail.com>
> Cc: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> Cc: Wei Liu <wei.liu2@citrix.com>
> ---
> Changes since v1:
>  - Use strrchr and strcmp in order to check the event path.
>  - Remove superfluous LOG in case of failed xenstore write.
>  - Remove uneeded strlen checks.
> ---
>  tools/libxl/libxl.c        | 32 ++++++++++++++++++--------------
>  tools/libxl/libxl_device.c |  9 ++++-----
>  2 files changed, 22 insertions(+), 19 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 10d1909..6c4ef6d 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -4410,32 +4410,36 @@ static void backend_watch_callback(libxl__egc
> *egc, libxl__ev_xswatch *watch,
>      libxl__ao *nested_ao = libxl__nested_ao_create(ddomain->ao);
>      STATE_AO_GC(nested_ao);
>      char *p, *path;
> -    const char *sstate;
> -    int state, rc, num_devs;
> +    const char *sstate, *sonline;
> +    int state, online, rc, num_devs;
>      libxl__device *dev = NULL;
>      libxl__ddomain_device *ddev = NULL;
>      libxl__ddomain_guest *dguest = NULL;
>      bool free_ao = false;
>  
> -    /* Check if event_path ends with "state" and truncate it */
> -    if (strlen(event_path) < strlen("state"))
> -        goto skip;
> -
> +    /* Check if event_path ends with "state" or "online" and truncate
> it. */
>      path = libxl__strdup(gc, event_path);
> -    p = path + strlen(path) - strlen("state") - 1;
> -    if (*p != '/')
> +    p = strrchr(path, '/');
> +    if (p == NULL)
>          goto skip;
> -    *p = '\0';
> -    p++;
> -    if (strcmp(p, "state") != 0)
> +    if (strcmp(p, "/state") != 0 && strcmp(p, "/online") != 0)
>          goto skip;
> +    /* Truncate the string so it points to the backend directory. */
> +    *p = '\0';
>  
> -    /* Check if the state is 1 (XenbusStateInitialising) or greater */
> -    rc = libxl__xs_read_checked(gc, XBT_NULL, event_path, &sstate);
> +    /* Fetch the value of the state and online nodes. */
> +    rc = libxl__xs_read_checked(gc, XBT_NULL, GCSPRINTF("%s/state",
> path),
> +                                &sstate);
>      if (rc || !sstate)
>          goto skip;
>      state = atoi(sstate);
>  
> +    rc = libxl__xs_read_checked(gc, XBT_NULL, GCSPRINTF("%s/online",
> path),
> +                                &sonline);
> +    if (rc || !sonline)
> +        goto skip;
> +    online = atoi(sonline);
> +
>      dev = libxl__zalloc(NOGC, sizeof(*dev));
>      rc = libxl__parse_backend_path(gc, path, dev);
>      if (rc)
> @@ -4477,7 +4481,7 @@ static void backend_watch_callback(libxl__egc *egc,
> libxl__ev_xswatch *watch,
>          rc = add_device(egc, nested_ao, dguest, ddev);
>          if (rc > 0)
>              free_ao = true;
> -    } else if (state == XenbusStateClosed) {
> +    } else if (state == XenbusStateClosed && online == 0) {
>          /*
>           * Removal of an active device, remove it from the list and
>           * free it's data structures if they are no longer needed.
> diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
> index bee5ed5..85a3662 100644
> --- a/tools/libxl/libxl_device.c
> +++ b/tools/libxl/libxl_device.c
> @@ -837,16 +837,15 @@ void libxl__initiate_device_remove(libxl__egc *egc,
>              goto out;
>          }
>  
> +        rc = libxl__xs_write_checked(gc, t, online_path, "0");
> +        if (rc)
> +            goto out;
> +
>          /*
>           * Check if device is already in "closed" state, in which case
>           * it should not be changed.
>           */
>           if (state && atoi(state) != XenbusStateClosed) {
> -            rc = libxl__xs_write_checked(gc, t, online_path, "0");
> -            if (rc) {
> -                LOG(ERROR, "unable to write to xenstore path %s",
> online_path);
> -                goto out;
> -            }
>              rc = libxl__xs_write_checked(gc, t, state_path,
> GCSPRINTF("%d", XenbusStateClosing));
>              if (rc) {
>                  LOG(ERROR, "unable to write to xenstore path %s",
> state_path);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

  reply	other threads:[~2015-09-23 11:08 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-23 10:06 [PATCH v2 for-4.6 0/2] libxl: devd fixes Roger Pau Monne
2015-09-23 10:06 ` [PATCH v2 for-4.6 1/2] libxl: fix devd removal path Roger Pau Monne
2015-09-23 11:08   ` Ian Campbell [this message]
2015-09-23 10:06 ` [PATCH v2 for-4.6 2/2] libxl: fix the cleanup of the backend path when using driver domains Roger Pau Monne
2015-09-23 11:09   ` Ian Campbell
2015-09-23 13:20 ` [PATCH v2 for-4.6 0/2] libxl: devd fixes Wei Liu
2015-09-23 14:10   ` Roger Pau Monné
2015-09-23 15:21     ` Wei Liu
2015-09-24 11:30       ` Ian Campbell

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=1443006522.10338.228.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=alex.j.velazquez@gmail.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=roger.pau@citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /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).