mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
msix: make [un]use vectors on reset/load optional
The facility to use/unuse vectors dynamically is helpful for virtio but little else: everyone just seems to use vectors in their init function. Avoid clearing msix vector use info on reset and load. For virtio, clear it explicitly. This should fix regressions reported with ivshmem - though I didn't test this, I verified that virtio keeps working like it did. Tested-by: Cam Macdonell <cam@cs.ualberta.ca> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
bc9a839d56
commit
3cac001e5a
2 changed files with 13 additions and 2 deletions
13
hw/msix.c
13
hw/msix.c
|
@ -336,6 +336,15 @@ static void msix_free_irq_entries(PCIDevice *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static void msix_clear_all_vectors(PCIDevice *dev)
|
||||
{
|
||||
int vector;
|
||||
|
||||
for (vector = 0; vector < dev->msix_entries_nr; ++vector) {
|
||||
msix_clr_pending(dev, vector);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up resources for the device. */
|
||||
void msix_uninit(PCIDevice *dev, MemoryRegion *table_bar, MemoryRegion *pba_bar)
|
||||
{
|
||||
|
@ -390,7 +399,7 @@ void msix_load(PCIDevice *dev, QEMUFile *f)
|
|||
return;
|
||||
}
|
||||
|
||||
msix_free_irq_entries(dev);
|
||||
msix_clear_all_vectors(dev);
|
||||
qemu_get_buffer(f, dev->msix_table, n * PCI_MSIX_ENTRY_SIZE);
|
||||
qemu_get_buffer(f, dev->msix_pba, (n + 7) / 8);
|
||||
msix_update_function_masked(dev);
|
||||
|
@ -436,7 +445,7 @@ void msix_reset(PCIDevice *dev)
|
|||
if (!msix_present(dev)) {
|
||||
return;
|
||||
}
|
||||
msix_free_irq_entries(dev);
|
||||
msix_clear_all_vectors(dev);
|
||||
dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] &=
|
||||
~dev->wmask[dev->msix_cap + MSIX_CONTROL_OFFSET];
|
||||
memset(dev->msix_table, 0, dev->msix_entries_nr * PCI_MSIX_ENTRY_SIZE);
|
||||
|
|
|
@ -131,6 +131,7 @@ static int virtio_pci_load_config(void * opaque, QEMUFile *f)
|
|||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
msix_unuse_all_vectors(&proxy->pci_dev);
|
||||
msix_load(&proxy->pci_dev, f);
|
||||
if (msix_present(&proxy->pci_dev)) {
|
||||
qemu_get_be16s(f, &proxy->vdev->config_vector);
|
||||
|
@ -246,6 +247,7 @@ void virtio_pci_reset(DeviceState *d)
|
|||
VirtIOPCIProxy *proxy = container_of(d, VirtIOPCIProxy, pci_dev.qdev);
|
||||
virtio_pci_stop_ioeventfd(proxy);
|
||||
virtio_reset(proxy->vdev);
|
||||
msix_unuse_all_vectors(&proxy->pci_dev);
|
||||
proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue