From: @kuhnchen18 Reviewed-by: @imxcc Signed-off-by: @imxcc
This commit is contained in:
commit
08474a4948
10
qemu.spec
10
qemu.spec
@ -1,6 +1,6 @@
|
|||||||
Name: qemu
|
Name: qemu
|
||||||
Version: 4.1.0
|
Version: 4.1.0
|
||||||
Release: 73
|
Release: 74
|
||||||
Epoch: 2
|
Epoch: 2
|
||||||
Summary: QEMU is a generic and open source machine emulator and virtualizer
|
Summary: QEMU is a generic and open source machine emulator and virtualizer
|
||||||
License: GPLv2 and BSD and MIT and CC-BY-SA-4.0
|
License: GPLv2 and BSD and MIT and CC-BY-SA-4.0
|
||||||
@ -498,6 +498,9 @@ Patch0485: vfio-Dirty-page-tracking-when-vIOMMU-is-enabled.patch
|
|||||||
Patch0486: vfio-Add-ioctl-to-get-dirty-pages-bitmap-during-dma-.patch
|
Patch0486: vfio-Add-ioctl-to-get-dirty-pages-bitmap-during-dma-.patch
|
||||||
Patch0487: vfio-Make-vfio-pci-device-migration-capable.patch
|
Patch0487: vfio-Make-vfio-pci-device-migration-capable.patch
|
||||||
Patch0488: qapi-Add-VFIO-devices-migration-stats-in-Migration-s.patch
|
Patch0488: qapi-Add-VFIO-devices-migration-stats-in-Migration-s.patch
|
||||||
|
Patch0489: vfio-Move-the-saving-of-the-config-space-to-the-righ.patch
|
||||||
|
Patch0490: vfio-Set-the-priority-of-the-VFIO-VM-state-change-ha.patch
|
||||||
|
Patch0491: vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch
|
||||||
|
|
||||||
BuildRequires: flex
|
BuildRequires: flex
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
@ -892,6 +895,11 @@ getent passwd qemu >/dev/null || \
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jul 29 2021 Chen Qun <kuhn.chenqun@huawei.com>
|
||||||
|
- vfio: Move the saving of the config space to the right place in VFIO migration
|
||||||
|
- vfio: Set the priority of the VFIO VM state change handler explicitly
|
||||||
|
- vfio: Avoid disabling and enabling vectors repeatedly in VFIO migration
|
||||||
|
|
||||||
* Thu Jul 29 2021 imxcc <xingchaochao@huawei.com>
|
* Thu Jul 29 2021 imxcc <xingchaochao@huawei.com>
|
||||||
- hw/net: fix vmxnet3 live migration
|
- hw/net: fix vmxnet3 live migration
|
||||||
- include: Make headers more self-contained
|
- include: Make headers more self-contained
|
||||||
|
|||||||
63
vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch
Normal file
63
vfio-Avoid-disabling-and-enabling-vectors-repeatedly.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
From 8113fdcf0c1383ae5b9542563656bea3753d834e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shenming Lu <lushenming@huawei.com>
|
||||||
|
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 <lushenming@huawei.com>
|
||||||
|
Message-Id: <20210310030233.1133-4-lushenming@huawei.com>
|
||||||
|
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
86
vfio-Move-the-saving-of-the-config-space-to-the-righ.patch
Normal file
86
vfio-Move-the-saving-of-the-config-space-to-the-righ.patch
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
From 483baf4c668fbd2da76e6948576e13eded1c54ec Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shenming Lu <lushenming@huawei.com>
|
||||||
|
Date: Wed, 10 Mar 2021 11:02:31 +0800
|
||||||
|
Subject: [PATCH] vfio: Move the saving of the config space to the right place
|
||||||
|
in VFIO migration
|
||||||
|
|
||||||
|
On ARM64 the VFIO SET_IRQS ioctl is dependent on the VM interrupt
|
||||||
|
setup, if the restoring of the VFIO PCI device config space is
|
||||||
|
before the VGIC, an error might occur in the kernel.
|
||||||
|
|
||||||
|
So we move the saving of the config space to the non-iterable
|
||||||
|
process, thus it will be called after the VGIC according to
|
||||||
|
their priorities.
|
||||||
|
|
||||||
|
As for the possible dependence of the device specific migration
|
||||||
|
data on it's config space, we can let the vendor driver to
|
||||||
|
include any config info it needs in its own data stream.
|
||||||
|
|
||||||
|
Signed-off-by: Shenming Lu <lushenming@huawei.com>
|
||||||
|
Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com>
|
||||||
|
Message-Id: <20210310030233.1133-2-lushenming@huawei.com>
|
||||||
|
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||||
|
---
|
||||||
|
hw/vfio/migration.c | 25 +++++++++++++++----------
|
||||||
|
1 file changed, 15 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
|
||||||
|
index b77c66557e..ea36ae5225 100644
|
||||||
|
--- a/hw/vfio/migration.c
|
||||||
|
+++ b/hw/vfio/migration.c
|
||||||
|
@@ -575,11 +575,6 @@ static int vfio_save_complete_precopy(QEMUFile *f, void *opaque)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = vfio_save_device_config_state(f, opaque);
|
||||||
|
- if (ret) {
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
ret = vfio_update_pending(vbasedev);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
@@ -620,6 +615,19 @@ static int vfio_save_complete_precopy(QEMUFile *f, void *opaque)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void vfio_save_state(QEMUFile *f, void *opaque)
|
||||||
|
+{
|
||||||
|
+ VFIODevice *vbasedev = opaque;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = vfio_save_device_config_state(f, opaque);
|
||||||
|
+ if (ret) {
|
||||||
|
+ error_report("%s: Failed to save device config space",
|
||||||
|
+ vbasedev->name);
|
||||||
|
+ qemu_file_set_error(f, ret);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int vfio_load_setup(QEMUFile *f, void *opaque)
|
||||||
|
{
|
||||||
|
VFIODevice *vbasedev = opaque;
|
||||||
|
@@ -670,11 +678,7 @@ static int vfio_load_state(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
switch (data) {
|
||||||
|
case VFIO_MIG_FLAG_DEV_CONFIG_STATE:
|
||||||
|
{
|
||||||
|
- ret = vfio_load_device_config_state(f, opaque);
|
||||||
|
- if (ret) {
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
+ return vfio_load_device_config_state(f, opaque);
|
||||||
|
}
|
||||||
|
case VFIO_MIG_FLAG_DEV_SETUP_STATE:
|
||||||
|
{
|
||||||
|
@@ -720,6 +724,7 @@ static SaveVMHandlers savevm_vfio_handlers = {
|
||||||
|
.save_live_pending = vfio_save_pending,
|
||||||
|
.save_live_iterate = vfio_save_iterate,
|
||||||
|
.save_live_complete_precopy = vfio_save_complete_precopy,
|
||||||
|
+ .save_state = vfio_save_state,
|
||||||
|
.load_setup = vfio_load_setup,
|
||||||
|
.load_cleanup = vfio_load_cleanup,
|
||||||
|
.load_state = vfio_load_state,
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
41
vfio-Set-the-priority-of-the-VFIO-VM-state-change-ha.patch
Normal file
41
vfio-Set-the-priority-of-the-VFIO-VM-state-change-ha.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
From b9d74bcf6aefe8ab607439ad1c518a453053ccee Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shenming Lu <lushenming@huawei.com>
|
||||||
|
Date: Wed, 10 Mar 2021 11:02:32 +0800
|
||||||
|
Subject: [PATCH] vfio: Set the priority of the VFIO VM state change handler
|
||||||
|
explicitly
|
||||||
|
|
||||||
|
In the VFIO VM state change handler when stopping the VM, the _RUNNING
|
||||||
|
bit in device_state is cleared which makes the VFIO device stop, including
|
||||||
|
no longer generating interrupts. Then we can save the pending states of
|
||||||
|
all interrupts in the GIC VM state change handler (on ARM).
|
||||||
|
|
||||||
|
So we have to set the priority of the VFIO VM state change handler
|
||||||
|
explicitly (like virtio devices) to ensure it is called before the
|
||||||
|
GIC's in saving.
|
||||||
|
|
||||||
|
Signed-off-by: Shenming Lu <lushenming@huawei.com>
|
||||||
|
Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Message-Id: <20210310030233.1133-3-lushenming@huawei.com>
|
||||||
|
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
|
||||||
|
---
|
||||||
|
hw/vfio/migration.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
|
||||||
|
index ea36ae5225..1a97784486 100644
|
||||||
|
--- a/hw/vfio/migration.c
|
||||||
|
+++ b/hw/vfio/migration.c
|
||||||
|
@@ -862,7 +862,8 @@ static int vfio_migration_init(VFIODevice *vbasedev,
|
||||||
|
register_savevm_live(id, VMSTATE_INSTANCE_ID_ANY, 1, &savevm_vfio_handlers,
|
||||||
|
vbasedev);
|
||||||
|
|
||||||
|
- migration->vm_state = qemu_add_vm_change_state_handler(vfio_vmstate_change,
|
||||||
|
+ migration->vm_state = qdev_add_vm_change_state_handler(vbasedev->dev,
|
||||||
|
+ vfio_vmstate_change,
|
||||||
|
vbasedev);
|
||||||
|
migration->migration_state.notify = vfio_migration_state_notifier;
|
||||||
|
add_migration_state_change_notifier(&migration->migration_state);
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user