All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] balloon: Fix failure of updating guest memory status
@ 2016-08-05 11:36 Ladi Prosek
  2016-08-15 12:09 ` Stefan Hajnoczi
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Ladi Prosek @ 2016-08-05 11:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: liang.z.li, mst, pbonzini, dgilbert, Ladi Prosek

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 <lprosek@redhat.com>
Suggested-by: Michael S. Tsirkin <mst@redhat.com>
---
 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

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-08-22  2:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-05 11:36 [Qemu-devel] [PATCH v3] balloon: Fix failure of updating guest memory status Ladi Prosek
2016-08-15 12:09 ` Stefan Hajnoczi
2016-08-15 12:35   ` Ladi Prosek
2016-08-15 12:50     ` Stefan Hajnoczi
2016-08-15 12:56       ` Ladi Prosek
2016-08-15 13:39 ` Michael S. Tsirkin
2016-08-15 23:08 ` Michael S. Tsirkin
2016-08-22  2:00 ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.