Alon Levy <al...@redhat.com> writes: > The target has not seen the guest_connected event via > spice_chr_guest_open or spice_chr_write, and so spice server wrongly > assumes there is no agent active, while the client continues to send > motion events only by the agent channel, which the server ignores. The > net effect is that the mouse is static in the guest. > > By registering the interface on post load spice server will pass on the > agent messages fixing the mouse behavior after migration. > > RHBZ #725965 > > Signed-off-by: Alon Levy <al...@redhat.com> > --- > spice-qemu-char.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/spice-qemu-char.c b/spice-qemu-char.c > index 09aa22d..08b6ba0 100644 > --- a/spice-qemu-char.c > +++ b/spice-qemu-char.c > @@ -1,6 +1,7 @@ > #include "config-host.h" > #include "trace.h" > #include "ui/qemu-spice.h" > +#include "hw/virtio-serial.h" > #include <spice.h> > #include <spice-experimental.h> > > @@ -25,6 +26,7 @@ typedef struct SpiceCharDriver { > uint8_t *datapos; > ssize_t bufsize, datalen; > uint32_t debug; > + QEMUTimer *post_load_timer; > } SpiceCharDriver; > > static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int > len) > @@ -156,6 +158,7 @@ static void spice_chr_close(struct CharDriverState *chr) > > printf("%s\n", __func__); > vmc_unregister_interface(s); > + qemu_free_timer(s->post_load_timer); > g_free(s); > } > > @@ -188,6 +191,33 @@ static void print_allowed_subtypes(void) > fprintf(stderr, "\n"); > } > > +static void spice_chr_post_load_cb(void *opaque) > +{ > + SpiceCharDriver *s = opaque; > + > + vmc_register_interface(s); > +} > + > +static int spice_chr_post_load(void *opaque, int version_id) > +{ > + SpiceCharDriver *s = opaque; > + > + if (s && s->chr && qemu_chr_be_connected(s->chr)) { > + qemu_mod_timer(s->post_load_timer, 1); > + }
You use the time to delay spice_chr_post_load_cb(), right? Can you explain why you have to delay? > + return 0; > +} > + > +static VMStateDescription spice_chr_vmstate = { > + .name = "spice-chr", > + .version_id = 1, > + .minimum_version_id = 1, > + .post_load = spice_chr_post_load, > + .fields = (VMStateField[]) { > + VMSTATE_END_OF_LIST() > + }, > +}; > + > CharDriverState *qemu_chr_open_spice(QemuOpts *opts) > { > CharDriverState *chr; > @@ -220,12 +250,16 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) > s->debug = debug; > s->active = false; > s->sin.subtype = subtype; > + s->post_load_timer = qemu_new_timer_ns(vm_clock, > + spice_chr_post_load_cb, s); > chr->opaque = s; > chr->chr_write = spice_chr_write; > chr->chr_close = spice_chr_close; > chr->chr_guest_open = spice_chr_guest_open; > chr->chr_guest_close = spice_chr_guest_close; > > + vmstate_register(NULL, -1, &spice_chr_vmstate, s); > + > #if SPICE_SERVER_VERSION < 0x000901 > /* See comment in vmc_state() */ > if (strcmp(subtype, "vdagent") == 0) {