Commit e6da76800041f9aadd0a3607bed99aaf59794560
Committed by
Anthony Liguori
1 parent
72755a70
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>
Showing
1 changed file
with
17 additions
and
5 deletions
hw/virtio-pci.c
... | ... | @@ -126,11 +126,18 @@ static int virtio_pci_load_config(void * opaque, QEMUFile *f) |
126 | 126 | VirtIOPCIProxy *proxy = opaque; |
127 | 127 | int ret; |
128 | 128 | ret = pci_device_load(&proxy->pci_dev, f); |
129 | - if (ret) | |
129 | + if (ret) { | |
130 | 130 | return ret; |
131 | + } | |
131 | 132 | msix_load(&proxy->pci_dev, f); |
132 | - if (msix_present(&proxy->pci_dev)) | |
133 | + if (msix_present(&proxy->pci_dev)) { | |
133 | 134 | qemu_get_be16s(f, &proxy->vdev->config_vector); |
135 | + } else { | |
136 | + proxy->vdev->config_vector = VIRTIO_NO_VECTOR; | |
137 | + } | |
138 | + if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR) { | |
139 | + return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector); | |
140 | + } | |
134 | 141 | return 0; |
135 | 142 | } |
136 | 143 | |
... | ... | @@ -138,10 +145,15 @@ static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f) |
138 | 145 | { |
139 | 146 | VirtIOPCIProxy *proxy = opaque; |
140 | 147 | uint16_t vector; |
141 | - if (!msix_present(&proxy->pci_dev)) | |
142 | - return 0; | |
143 | - qemu_get_be16s(f, &vector); | |
148 | + if (msix_present(&proxy->pci_dev)) { | |
149 | + qemu_get_be16s(f, &vector); | |
150 | + } else { | |
151 | + vector = VIRTIO_NO_VECTOR; | |
152 | + } | |
144 | 153 | virtio_queue_set_vector(proxy->vdev, n, vector); |
154 | + if (vector != VIRTIO_NO_VECTOR) { | |
155 | + return msix_vector_use(&proxy->pci_dev, vector); | |
156 | + } | |
145 | 157 | return 0; |
146 | 158 | } |
147 | 159 | ... | ... |