07d2889ef8
Update to v2.6.1 stable release. OBS-URL: https://build.opensuse.org/request/show/419833 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=311
104 lines
3.3 KiB
Diff
104 lines
3.3 KiB
Diff
From 57e6b7c9e33686c070e6b5bce203e1a4a01b821d 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);
|