diff --git a/vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch b/vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch new file mode 100644 index 0000000..e65b3a8 --- /dev/null +++ b/vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch @@ -0,0 +1,63 @@ +From 8113fdcf0c1383ae5b9542563656bea3753d834e Mon Sep 17 00:00:00 2001 +From: Shenming Lu +Date: Wed, 10 Mar 2021 11:02:33 +0800 +Subject: [PATCH] vfio: Avoid disabling and enabling vectors repeatedly in VFIO + migration + +In VFIO migration resume phase and some guest startups, there are +already unmasked vectors in the vector table when calling +vfio_msix_enable(). So in order to avoid inefficiently disabling +and enabling vectors repeatedly, let's allocate all needed vectors +first and then enable these unmasked vectors one by one without +disabling. + +Signed-off-by: Shenming Lu +Message-Id: <20210310030233.1133-4-lushenming@huawei.com> +Signed-off-by: Alex Williamson +--- + hw/vfio/pci.c | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c +index a637c35e7a..da7c740bce 100644 +--- a/hw/vfio/pci.c ++++ b/hw/vfio/pci.c +@@ -563,6 +563,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); +@@ -581,11 +584,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"); + } +-- +2.27.0 +