Commit 705be570 authored by Anthony PERARD's avatar Anthony PERARD
Browse files

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: default avatarAnthony PERARD <anthony.perard@citrix.com>
Reviewed-by: default avatarPaul Durrant <paul.durrant@citrix.com>
Message-Id: <20190823101534.465-3-anthony.perard@citrix.com>
parent cb323146
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -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,8 +711,10 @@ static void xen_device_frontend_set_state(XenDevice *xendev,
                                    xs_strstate(state));

    xendev->frontend_state = 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);