Hi

On Fri, Dec 30, 2022 at 6:49 PM <dengp...@chinatelecom.cn> wrote:
>
> 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),

You are missing a lot of states from VDAgentChardev. Most of the
fields must be saved/restored.

> +        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
>
>


--
Marc-André Lureau

Reply via email to