qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3] balloon: Fix failure of updating guest memor


From: Michael S. Tsirkin
Subject: Re: [Qemu-devel] [PATCH v3] balloon: Fix failure of updating guest memory status
Date: Mon, 22 Aug 2016 05:00:04 +0300

On Fri, Aug 05, 2016 at 01:36:32PM +0200, Ladi Prosek wrote:
> The stats_vq_elem field keeps track of the state of the balloon stats
> virtqueue protocol but it wasn't preserved across migrations, resulting
> in losing guest memory status updates on the receiving VM.
> 
> This commit adds a new VM state change handler which resets stats_vq_elem
> to NULL when the VM is stopped, eliminating the need for the field to be
> migrated. When the VM starts running again, the field is reinitialized by
> re-popping the element from the virtqueue.
> 
> Signed-off-by: Ladi Prosek <address@hidden>
> Suggested-by: Michael S. Tsirkin <address@hidden>

OK, but we also must migrate the stats timer value,
otherwise management must specify it again on destination.

Only for compat machine types unfortunately otherwise
we break migration from old QEMU...



> ---
>  hw/virtio/virtio-balloon.c         | 23 +++++++++++++++++++++++
>  include/hw/virtio/virtio-balloon.h |  1 +
>  2 files changed, 24 insertions(+)
> 
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index 5af429a..65457e9 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -423,6 +423,26 @@ static int virtio_balloon_load_device(VirtIODevice 
> *vdev, QEMUFile *f,
>      return 0;
>  }
>  
> +static void virtio_balloon_vmstate_cb(void *opaque, int running,
> +                                      RunState state)
> +{
> +    VirtIOBalloon *s = opaque;
> +
> +    if (!running) {
> +        /* put the stats element back if the VM is not running */
> +        if (s->stats_vq_elem != NULL) {
> +            virtqueue_discard(s->svq, s->stats_vq_elem, s->stats_vq_offset);
> +            g_free(s->stats_vq_elem);
> +            s->stats_vq_elem = NULL;
> +        }
> +
> +    } else {
> +        /* poll stats queue for the element we may have discarded
> +         * when the VM was stopped */
> +        virtio_balloon_receive_stats(VIRTIO_DEVICE(s), s->svq);
> +    }
> +}
> +
>  static void virtio_balloon_device_realize(DeviceState *dev, Error **errp)
>  {
>      VirtIODevice *vdev = VIRTIO_DEVICE(dev);
> @@ -446,6 +466,8 @@ static void virtio_balloon_device_realize(DeviceState 
> *dev, Error **errp)
>      s->svq = virtio_add_queue(vdev, 128, virtio_balloon_receive_stats);
>  
>      reset_stats(s);
> +
> +    s->change = qemu_add_vm_change_state_handler(virtio_balloon_vmstate_cb, 
> s);
>  }
>  
>  static void virtio_balloon_device_unrealize(DeviceState *dev, Error **errp)
> @@ -453,6 +475,7 @@ static void virtio_balloon_device_unrealize(DeviceState 
> *dev, Error **errp)
>      VirtIODevice *vdev = VIRTIO_DEVICE(dev);
>      VirtIOBalloon *s = VIRTIO_BALLOON(dev);
>  
> +    qemu_del_vm_change_state_handler(s->change);
>      balloon_stats_destroy_timer(s);
>      qemu_remove_balloon_handler(s);
>      virtio_cleanup(vdev);
> diff --git a/include/hw/virtio/virtio-balloon.h 
> b/include/hw/virtio/virtio-balloon.h
> index 1ea13bd..d72ff7f 100644
> --- a/include/hw/virtio/virtio-balloon.h
> +++ b/include/hw/virtio/virtio-balloon.h
> @@ -43,6 +43,7 @@ typedef struct VirtIOBalloon {
>      int64_t stats_last_update;
>      int64_t stats_poll_interval;
>      uint32_t host_features;
> +    VMChangeStateEntry *change;
>  } VirtIOBalloon;
>  
>  #endif
> -- 
> 2.5.5



reply via email to

[Prev in Thread] Current Thread [Next in Thread]