aboutsummaryrefslogtreecommitdiff
path: root/hw/xen
diff options
context:
space:
mode:
authorAnthony PERARD <anthony.perard@citrix.com>2019-08-23 11:15:34 +0100
committerAnthony PERARD <anthony.perard@citrix.com>2019-08-27 14:18:28 +0100
commit705be570941b38cd1cbebc68f7f671ce7532ecb0 (patch)
treecd0383fd2ad62e8e46a39b17164989b83508e733 /hw/xen
parentcb3231460747552d70af9d546dc53d8195bcb796 (diff)
xen-bus: Avoid rewriting identical values to xenstore
When QEMU receives a xenstore watch event suggesting that the "state" of the frontend changed, it records this in its own state but it also re-write the value back into xenstore even so there were no change. This triggers an unnecessary xenstore watch event which QEMU will process again (and maybe the frontend as well). Also QEMU could potentially write an already old value. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> Message-Id: <20190823101534.465-3-anthony.perard@citrix.com>
Diffstat (limited to 'hw/xen')
-rw-r--r--hw/xen/xen-bus.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index 62c127b926..a04478ad4f 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -698,7 +698,8 @@ int xen_device_frontend_scanf(XenDevice *xendev, const char *key,
}
static void xen_device_frontend_set_state(XenDevice *xendev,
- enum xenbus_state state)
+ enum xenbus_state state,
+ bool publish)
{
const char *type = object_get_typename(OBJECT(xendev));
@@ -710,7 +711,9 @@ static void xen_device_frontend_set_state(XenDevice *xendev,
xs_strstate(state));
xendev->frontend_state = state;
- xen_device_frontend_printf(xendev, "state", "%u", state);
+ if (publish) {
+ xen_device_frontend_printf(xendev, "state", "%u", state);
+ }
}
static void xen_device_frontend_changed(void *opaque)
@@ -726,7 +729,7 @@ static void xen_device_frontend_changed(void *opaque)
state = XenbusStateUnknown;
}
- xen_device_frontend_set_state(xendev, state);
+ xen_device_frontend_set_state(xendev, state, false);
if (state == XenbusStateInitialising &&
xendev->backend_state == XenbusStateClosed &&
@@ -1169,7 +1172,7 @@ static void xen_device_realize(DeviceState *dev, Error **errp)
xen_device_frontend_printf(xendev, "backend-id", "%u",
xenbus->backend_id);
- xen_device_frontend_set_state(xendev, XenbusStateInitialising);
+ xen_device_frontend_set_state(xendev, XenbusStateInitialising, true);
xendev->exit.notify = xen_device_exit;
qemu_add_exit_notifier(&xendev->exit);