Message ID | 1469791051-680-2-git-send-email-jgross@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@suse.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> > 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 >
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);
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@suse.com> --- hw/xen/xen_backend.c | 58 +++++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 39 deletions(-)