[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |