@@ -131,6 +131,10 @@ static int virtio_pci_load_config(void * opaque, QEMUFile *f)
msix_load(&proxy->pci_dev, f);
if (msix_present(&proxy->pci_dev))
qemu_get_be16s(f, &proxy->vdev->config_vector);
+ else
+ proxy->vdev->config_vector = VIRTIO_NO_VECTOR;
+ if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR)
+ return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector);
return 0;
}
@@ -138,10 +142,13 @@ static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
{
VirtIOPCIProxy *proxy = opaque;
uint16_t vector;
- if (!msix_present(&proxy->pci_dev))
- return 0;
- qemu_get_be16s(f, &vector);
+ if (msix_present(&proxy->pci_dev))
+ qemu_get_be16s(f, &vector);
+ else
+ vector = VIRTIO_NO_VECTOR;
virtio_queue_set_vector(proxy->vdev, n, vector);
+ if (vector != VIRTIO_NO_VECTOR)
+ return msix_vector_use(&proxy->pci_dev, vector);
return 0;
}
Usage of msi vectors is controlled by the guest and so needs to be restored on load. Do this for msi vectors used by the virtio device. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- hw/virtio-pci.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-)