Signed-off-by: Juan Quintela <quint...@redhat.com>
---
 hw/virtio.c |   45 +++++++++++++++++++++++++++++----------------
 1 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/hw/virtio.c b/hw/virtio.c
index f549543..bb93e8c 100644
--- a/hw/virtio.c
+++ b/hw/virtio.c
@@ -656,6 +656,32 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
     }
 }

+static int virtio_post_load(void *opaque, int version_id)
+{
+    VirtIODevice *vdev = opaque;
+    int i, ret;
+
+    for (i = 0; i < vdev->num_pci_queues; i++) {
+        if (vdev->vq[i].pa) {
+            virtqueue_init(&vdev->vq[i]);
+        }
+        if (vdev->type == VIRTIO_PCI) {
+            if (!virtio_pci_msix_present(vdev->binding_opaque)) {
+                vdev->vq[i].vector = VIRTIO_NO_VECTOR;
+            }
+            if (vdev->vq[i].vector != VIRTIO_NO_VECTOR) {
+                ret = virtio_pci_msix_vector_use(vdev->binding_opaque,
+                                                 vdev->vq[i].vector);
+                if (ret)
+                    return ret;
+            }
+        }
+    }
+
+    virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
+    return 0;
+}
+
 int virtio_load(VirtIODevice *vdev, QEMUFile *f)
 {
     int i, ret;
@@ -681,25 +707,12 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
         vdev->vq[i].pa = qemu_get_be64(f);
         qemu_get_be16s(f, &vdev->vq[i].last_avail_idx);

-        if (vdev->vq[i].pa) {
-            virtqueue_init(&vdev->vq[i]);
-        }
-        if (vdev->type == VIRTIO_PCI) {
-            if (virtio_pci_msix_present(vdev->binding_opaque)) {
+        if (vdev->type == VIRTIO_PCI &&
+            virtio_pci_msix_present(vdev->binding_opaque)) {
                 qemu_get_be16s(f, &vdev->vq[i].vector);
-            } else {
-                vdev->vq[i].vector = VIRTIO_NO_VECTOR;
-            }
-            if (vdev->vq[i].vector != VIRTIO_NO_VECTOR) {
-                ret = virtio_pci_msix_vector_use(vdev->binding_opaque,
-                                                 vdev->vq[i].vector);
-                if (ret)
-                    return ret;
-            }
         }
     }
-
-    virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
+    virtio_post_load(vdev, 1);
     return 0;
 }

-- 
1.6.5.2



Reply via email to