619821
From 92a638cb3b0601746d47b4a443762fe71bb21431 Mon Sep 17 00:00:00 2001
4f5da8
From: Ladi Prosek <lprosek@redhat.com>
4f5da8
Date: Thu, 10 Nov 2016 23:00:51 +0100
4f5da8
Subject: [PATCH 8/8] virtio-balloon: fix stats vq migration
4f5da8
4f5da8
RH-Author: Ladi Prosek <lprosek@redhat.com>
4f5da8
Message-id: <1478797251-10302-2-git-send-email-lprosek@redhat.com>
4f5da8
Patchwork-id: 72819
4f5da8
O-Subject: [PATCH v2 8/6] virtio-balloon: fix stats vq migration
619821
Bugzilla: 1377968
4f5da8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
4f5da8
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
4f5da8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
4f5da8
4f5da8
The statistics virtqueue is not migrated properly because virtio-balloon
4f5da8
does not include s->stats_vq_elem in the migration stream.
4f5da8
4f5da8
After migration the statistics virtqueue hangs because the host never
4f5da8
completes the last element (s->stats_vq_elem is NULL on the destination
4f5da8
QEMU).  Therefore the guest never submits new elements and the virtqueue
4f5da8
is hung.
4f5da8
4f5da8
Instead of changing the migration stream format in an incompatible way,
4f5da8
detect the migration case and rewind the virtqueue so the last element
4f5da8
can be completed.
4f5da8
4f5da8
Cc: Michael S. Tsirkin <mst@redhat.com>
4f5da8
Cc: Roman Kagan <rkagan@virtuozzo.com>
4f5da8
Cc: Stefan Hajnoczi <stefanha@redhat.com>
4f5da8
Suggested-by: Roman Kagan <rkagan@virtuozzo.com>
4f5da8
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
4f5da8
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
4f5da8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
4f5da8
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
4f5da8
(cherry picked from commit 4a1e48becab81020adfb74b22c76a595f2d02a01)
4f5da8
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
4f5da8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4f5da8
---
4f5da8
 hw/virtio/virtio-balloon.c | 13 +++++++++++++
4f5da8
 1 file changed, 13 insertions(+)
4f5da8
4f5da8
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
4f5da8
index faf93f7..1a60d3c 100644
4f5da8
--- a/hw/virtio/virtio-balloon.c
4f5da8
+++ b/hw/virtio/virtio-balloon.c
4f5da8
@@ -403,6 +403,18 @@ static void virtio_balloon_device_reset(VirtIODevice *vdev)
4f5da8
     }
4f5da8
 }
4f5da8
 
4f5da8
+static void virtio_balloon_set_status(VirtIODevice *vdev, uint8_t status)
4f5da8
+{
4f5da8
+    VirtIOBalloon *s = VIRTIO_BALLOON(vdev);
4f5da8
+
4f5da8
+    if (!s->stats_vq_elem_pending && vdev->vm_running &&
4f5da8
+        (status & VIRTIO_CONFIG_S_DRIVER_OK) && virtqueue_rewind(s->svq, 1)) {
4f5da8
+        /* poll stats queue for the element we have discarded when the VM
4f5da8
+         * was stopped */
4f5da8
+        virtio_balloon_receive_stats(vdev, s->svq);
4f5da8
+    }
4f5da8
+}
4f5da8
+
4f5da8
 static Property virtio_balloon_properties[] = {
4f5da8
     DEFINE_PROP_END_OF_LIST(),
4f5da8
 };
4f5da8
@@ -419,6 +431,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
4f5da8
     vdc->get_config = virtio_balloon_get_config;
4f5da8
     vdc->set_config = virtio_balloon_set_config;
4f5da8
     vdc->get_features = virtio_balloon_get_features;
4f5da8
+    vdc->set_status = virtio_balloon_set_status;
4f5da8
 }
4f5da8
 
4f5da8
 static const TypeInfo virtio_balloon_info = {
4f5da8
-- 
4f5da8
1.8.3.1
4f5da8