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