104 lines
3.3 KiB
Diff
104 lines
3.3 KiB
Diff
|
From 0d4ea8a7847a76415ed0d0db0392be5b7d1b71a6 Mon Sep 17 00:00:00 2001
|
||
|
From: Juergen Gross <jgross@suse.com>
|
||
|
Date: Fri, 29 Jul 2016 12:51:53 +0200
|
||
|
Subject: [PATCH] xen: when removing a backend don't remove many of them
|
||
|
|
||
|
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>
|
||
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||
|
---
|
||
|
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 6e52474..8f347da 100644
|
||
|
--- a/hw/xen/xen_backend.c
|
||
|
+++ b/hw/xen/xen_backend.c
|
||
|
@@ -322,48 +322,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);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
@@ -683,7 +663,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);
|