diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2021-03-17 19:30:13 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2021-03-17 19:30:13 +0000 |
| commit | 2255564fd21059960966b47212def9069cb56077 (patch) | |
| tree | 451e8764c53b9283a555ac50b6aad16dd0b55826 /hw/vfio/pci.c | |
| parent | 69259911f948ad2755bd1f2c999dd60ac322c890 (diff) | |
| parent | 758b96b61d5cbc19204f340012d5a325f0a2105b (diff) | |
| download | focaccia-qemu-2255564fd21059960966b47212def9069cb56077.tar.gz focaccia-qemu-2255564fd21059960966b47212def9069cb56077.zip | |
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20210316.0' into staging
VFIO update 2021-03-16 * Fix "listerner" typo (Zenghui Yu) * Inclusive language and MAINTAINERS update (Philippe Mathieu-Daudé) * vIOMMU unmap notifier fixes (Eric Auger) * Migration fixes and optimizations (Shenming Lu) * Use host page size for dirty bitmap (Kunkun Jiang) * Use log_global_start/stop to switch dirty tracking (Keqian Zhu) # gpg: Signature made Tue 16 Mar 2021 16:59:10 GMT # gpg: using RSA key 239B9B6E3BB08B22 # gpg: Good signature from "Alex Williamson <alex.williamson@redhat.com>" [full] # gpg: aka "Alex Williamson <alex@shazbot.org>" [full] # gpg: aka "Alex Williamson <alwillia@redhat.com>" [full] # gpg: aka "Alex Williamson <alex.l.williamson@gmail.com>" [full] # Primary key fingerprint: 42F6 C04E 540B D1A9 9E7B 8A90 239B 9B6E 3BB0 8B22 * remotes/awilliam/tags/vfio-update-20210316.0: vfio/migrate: Move switch of dirty tracking into vfio_memory_listener vfio: Support host translation granule size vfio: Avoid disabling and enabling vectors repeatedly in VFIO migration vfio: Set the priority of the VFIO VM state change handler explicitly vfio: Move the saving of the config space to the right place in VFIO migration spapr_iommu: Fix vhost integration regression vfio: Do not register any IOMMU_NOTIFIER_DEVIOTLB_UNMAP notifier MAINTAINERS: Cover docs/igd-assign.txt in VFIO section hw/vfio/pci-quirks: Replace the word 'blacklist' vfio: Fix vfio_listener_log_sync function name typo Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/vfio/pci.c')
| -rw-r--r-- | hw/vfio/pci.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index f74be78209..5c65aa0a98 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -569,6 +569,9 @@ static void vfio_msix_vector_release(PCIDevice *pdev, unsigned int nr) static void vfio_msix_enable(VFIOPCIDevice *vdev) { + PCIDevice *pdev = &vdev->pdev; + unsigned int nr, max_vec = 0; + vfio_disable_interrupts(vdev); vdev->msi_vectors = g_new0(VFIOMSIVector, vdev->msix->entries); @@ -587,11 +590,22 @@ static void vfio_msix_enable(VFIOPCIDevice *vdev) * triggering to userspace, then immediately release the vector, leaving * the physical device with no vectors enabled, but MSI-X enabled, just * like the guest view. + * If there are already unmasked vectors (in migration resume phase and + * some guest startups) which will be enabled soon, we can allocate all + * of them here to avoid inefficiently disabling and enabling vectors + * repeatedly later. */ - vfio_msix_vector_do_use(&vdev->pdev, 0, NULL, NULL); - vfio_msix_vector_release(&vdev->pdev, 0); + if (!pdev->msix_function_masked) { + for (nr = 0; nr < msix_nr_vectors_allocated(pdev); nr++) { + if (!msix_is_masked(pdev, nr)) { + max_vec = nr; + } + } + } + vfio_msix_vector_do_use(pdev, max_vec, NULL, NULL); + vfio_msix_vector_release(pdev, max_vec); - if (msix_set_vector_notifiers(&vdev->pdev, vfio_msix_vector_use, + if (msix_set_vector_notifiers(pdev, vfio_msix_vector_use, vfio_msix_vector_release, NULL)) { error_report("vfio: msix_set_vector_notifiers failed"); } @@ -900,7 +914,7 @@ static void vfio_pci_size_rom(VFIOPCIDevice *vdev) if (vdev->pdev.romfile || !vdev->pdev.rom_bar) { /* Since pci handles romfile, just print a message and return */ - if (vfio_blacklist_opt_rom(vdev) && vdev->pdev.romfile) { + if (vfio_opt_rom_in_denylist(vdev) && vdev->pdev.romfile) { warn_report("Device at %s is known to cause system instability" " issues during option rom execution", vdev->vbasedev.name); @@ -927,7 +941,7 @@ static void vfio_pci_size_rom(VFIOPCIDevice *vdev) return; } - if (vfio_blacklist_opt_rom(vdev)) { + if (vfio_opt_rom_in_denylist(vdev)) { if (dev->opts && qemu_opt_get(dev->opts, "rombar")) { warn_report("Device at %s is known to cause system instability" " issues during option rom execution", |