diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2009-07-05 16:02:34 +0300 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-07-10 13:44:30 -0500 |
commit | e6da76800041f9aadd0a3607bed99aaf59794560 (patch) | |
tree | 98d4ff534034dce754c89dfb2fba9292f94f1d93 /hw/virtio-pci.c | |
parent | 72755a709619b1db204c675df8f1093d54e38128 (diff) | |
download | hqemu-e6da76800041f9aadd0a3607bed99aaf59794560.zip hqemu-e6da76800041f9aadd0a3607bed99aaf59794560.tar.gz |
qemu/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 <mst@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/virtio-pci.c')
-rw-r--r-- | hw/virtio-pci.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 39e290d..3b9bfd1 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; } |