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