yeahuh / rpms / qemu-kvm

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