aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2009-07-05 16:02:34 +0300
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-10 13:44:30 -0500
commite6da76800041f9aadd0a3607bed99aaf59794560 (patch)
tree98d4ff534034dce754c89dfb2fba9292f94f1d93
parent72755a709619b1db204c675df8f1093d54e38128 (diff)
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>
-rw-r--r--hw/virtio-pci.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 39e290dc62..3b9bfd1756 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;
}