From cf2e620604a11caee6c10357b1c9fb5aee6c78ca Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Sun, 5 Jul 2009 16:02:34 +0300 Subject: virtio: mark msi vectors used on load 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 Signed-off-by: Avi Kivity --- hw/virtio-pci.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index f7da50375..19ba5b858 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -126,11 +126,18 @@ static int virtio_pci_load_config(void * opaque, QEMUFile *f) VirtIOPCIProxy *proxy = opaque; int ret; ret = pci_device_load(&proxy->pci_dev, f); - if (ret) + if (ret) { return ret; + } msix_load(&proxy->pci_dev, f); - if (msix_present(&proxy->pci_dev)) + 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 +145,15 @@ 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; } -- cgit v1.2.3