Patchwork [17/41] virtio: split virtio_post_load() from virtio_load()

login
register
mail settings
Submitter Juan Quintela
Date Dec. 2, 2009, 12:04 p.m.
Message ID <f71b2d1cc62a2ebada311bcc6fd330d095512de8.1259754427.git.quintela@redhat.com>
Download mbox | patch
Permalink /patch/40022/
State New
Headers show

Comments

Juan Quintela - Dec. 2, 2009, 12:04 p.m.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 hw/virtio.c |   45 +++++++++++++++++++++++++++++----------------
 1 files changed, 29 insertions(+), 16 deletions(-)

Patch

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