[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] xen: when removing a backend don't remove m
From: |
Stefano Stabellini |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] xen: when removing a backend don't remove many of them |
Date: |
Mon, 1 Aug 2016 18:26:18 -0700 (PDT) |
User-agent: |
Alpine 2.10 (DEB 1266 2009-07-14) |
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 <address@hidden>
Reviewed-by: Stefano Stabellini <address@hidden>
> 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
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH 1/2] xen: when removing a backend don't remove many of them,
Stefano Stabellini <=