[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/2] xen: when removing a backend don't remove many of them



On Fri, 29 Jul 2016, Juergen Gross wrote:
> When a Xenstore watch fires indicating a backend has to be removed
> don't remove all backends for that domain with the specified device
> index, but just the one which has the correct type.
> 
> The easiest way to achieve this is to use the already determined
> xendev as parameter for xen_be_del_xendev() instead of only the domid
> and device index.
> 
> This at once removes the open coded QTAILQ_FOREACH_SAVE() in
> xen_be_del_xendev() as there is no need to search for the correct
> xendev any longer.
> 
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


>  hw/xen/xen_backend.c | 58 
> +++++++++++++++++-----------------------------------
>  1 file changed, 19 insertions(+), 39 deletions(-)
> 
> diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
> index bab79b1..3ceb778 100644
> --- a/hw/xen/xen_backend.c
> +++ b/hw/xen/xen_backend.c
> @@ -321,48 +321,28 @@ static struct XenDevice *xen_be_get_xendev(const char 
> *type, int dom, int dev,
>  /*
>   * release xen backend device.
>   */
> -static struct XenDevice *xen_be_del_xendev(int dom, int dev)
> +static void xen_be_del_xendev(struct XenDevice *xendev)
>  {
> -    struct XenDevice *xendev, *xnext;
> -
> -    /*
> -     * This is pretty much like QTAILQ_FOREACH(xendev, &xendevs, next) but
> -     * we save the next pointer in xnext because we might free xendev.
> -     */
> -    xnext = xendevs.tqh_first;
> -    while (xnext) {
> -        xendev = xnext;
> -        xnext = xendev->next.tqe_next;
> -
> -        if (xendev->dom != dom) {
> -            continue;
> -        }
> -        if (xendev->dev != dev && dev != -1) {
> -            continue;
> -        }
> -
> -        if (xendev->ops->free) {
> -            xendev->ops->free(xendev);
> -        }
> -
> -        if (xendev->fe) {
> -            char token[XEN_BUFSIZE];
> -            snprintf(token, sizeof(token), "fe:%p", xendev);
> -            xs_unwatch(xenstore, xendev->fe, token);
> -            g_free(xendev->fe);
> -        }
> +    if (xendev->ops->free) {
> +        xendev->ops->free(xendev);
> +    }
>  
> -        if (xendev->evtchndev != NULL) {
> -            xenevtchn_close(xendev->evtchndev);
> -        }
> -        if (xendev->gnttabdev != NULL) {
> -            xengnttab_close(xendev->gnttabdev);
> -        }
> +    if (xendev->fe) {
> +        char token[XEN_BUFSIZE];
> +        snprintf(token, sizeof(token), "fe:%p", xendev);
> +        xs_unwatch(xenstore, xendev->fe, token);
> +        g_free(xendev->fe);
> +    }
>  
> -        QTAILQ_REMOVE(&xendevs, xendev, next);
> -        g_free(xendev);
> +    if (xendev->evtchndev != NULL) {
> +        xenevtchn_close(xendev->evtchndev);
>      }
> -    return NULL;
> +    if (xendev->gnttabdev != NULL) {
> +        xengnttab_close(xendev->gnttabdev);
> +    }
> +
> +    QTAILQ_REMOVE(&xendevs, xendev, next);
> +    g_free(xendev);
>  }
>  
>  /*
> @@ -682,7 +662,7 @@ static void xenstore_update_be(char *watch, char *type, 
> int dom,
>      if (xendev != NULL) {
>          bepath = xs_read(xenstore, 0, xendev->be, &len);
>          if (bepath == NULL) {
> -            xen_be_del_xendev(dom, dev);
> +            xen_be_del_xendev(xendev);
>          } else {
>              free(bepath);
>              xen_be_backend_changed(xendev, path);
> -- 
> 2.6.6
> 

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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.