From: "dengp...@chinatelecom.cn" <dengp...@chinatelecom.cn>
To support live migration, we made the following 2 modifications: 1. save the caps field of VDAgentChardev. 2. register vdagent to qemu-clipboard after vm device state being reloaded during live migration. Signed-off-by: dengp...@chinatelecom.cn <dengp...@chinatelecom.cn> Signed-off-by: liuy...@chinatelecom.cn <liuy...@chinatelecom.cn> --- ui/trace-events | 1 + ui/vdagent.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/ui/trace-events b/ui/trace-events index 5e50b60da5..ccacd867d1 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -144,6 +144,7 @@ vdagent_cb_grab_discard(const char *name, int cur, int recv) "selection %s, cur: vdagent_cb_grab_type(const char *name) "type %s" vdagent_cb_serial_discard(uint32_t current, uint32_t received) "current=%u, received=%u" vdagent_recv_caps(uint32_t caps) "received caps %u" +vdagent_migration_caps(uint32_t caps) "migrated caps %u" # dbus.c dbus_registered_listener(const char *bus_name) "peer %s" diff --git a/ui/vdagent.c b/ui/vdagent.c index 38061d5b38..1193abe348 100644 --- a/ui/vdagent.c +++ b/ui/vdagent.c @@ -6,6 +6,7 @@ #include "qemu/units.h" #include "hw/qdev-core.h" #include "migration/blocker.h" +#include "migration/vmstate.h" #include "ui/clipboard.h" #include "ui/console.h" #include "ui/input.h" @@ -906,6 +907,31 @@ static void vdagent_chr_parse(QemuOpts *opts, ChardevBackend *backend, /* ------------------------------------------------------------------ */ +static int vdagent_post_load(void *opaque, int version_id) +{ + VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(opaque); + + trace_vdagent_migration_caps(vd->caps); + + if (vd->caps) { + vdagent_register_to_qemu_clipboard(vd); + qemu_input_handler_activate(vd->mouse_hs); + } + + return 0; +} + +static const VMStateDescription vmstate_vdagent = { + .name = "vdagent", + .version_id = 1, + .minimum_version_id = 1, + .post_load = vdagent_post_load, + .fields = (VMStateField[]) { + VMSTATE_UINT32(caps, VDAgentChardev), + VMSTATE_END_OF_LIST() + }, +}; + static void vdagent_chr_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); @@ -922,6 +948,8 @@ static void vdagent_chr_init(Object *obj) VDAgentChardev *vd = QEMU_VDAGENT_CHARDEV(obj); buffer_init(&vd->outbuf, "vdagent-outbuf"); + + vmstate_register(NULL, 0, &vmstate_vdagent, vd); error_setg(&vd->migration_blocker, "The vdagent chardev doesn't yet support migration"); } -- 2.27.0