Browse Source

vfio/migration: Allow live migration with vIOMMU without VFs using device dirty tracking

Commit e46883204c ("vfio/migration: Block migration with vIOMMU")
introduces a migration blocker when vIOMMU is enabled, because we need
to calculate the IOVA ranges for device dirty tracking. But this is
unnecessary for iommu dirty tracking.

Limit the vfio_viommu_preset() check to those devices which use device
dirty tracking. This allows live migration with VFIO devices which use
iommu dirty tracking.

Suggested-by: Jason Zeng <jason.zeng@intel.com>
Co-developed-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
Tested-by: Xudong Hao <xudong.hao@intel.com>
Tested-by: Giovannio Cabiddu <giovanni.cabiddu@intel.com>
Tested-by: Rohith S R <rohith.s.r@intel.com>
Link: https://lore.kernel.org/qemu-devel/20251218062643.624796-10-zhenzhong.duan@intel.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
pull/316/head
Zhenzhong Duan 3 months ago
committed by Cédric Le Goater
parent
commit
0e3c1e2b2b
  1. 5
      hw/vfio/container.c
  2. 6
      hw/vfio/device.c
  3. 6
      hw/vfio/migration.c
  4. 10
      include/hw/vfio/vfio-device.h

5
hw/vfio/container.c

@ -178,10 +178,7 @@ bool vfio_container_devices_dirty_tracking_is_supported(
VFIODevice *vbasedev;
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
if (vbasedev->device_dirty_page_tracking == ON_OFF_AUTO_OFF) {
return false;
}
if (!vbasedev->dirty_pages_supported) {
if (vfio_device_dirty_pages_disabled(vbasedev)) {
return false;
}
}

6
hw/vfio/device.c

@ -412,6 +412,12 @@ bool vfio_device_is_mdev(VFIODevice *vbasedev)
return subsys && (strcmp(subsys, "/sys/bus/mdev") == 0);
}
bool vfio_device_dirty_pages_disabled(VFIODevice *vbasedev)
{
return (!vbasedev->dirty_pages_supported ||
vbasedev->device_dirty_page_tracking == ON_OFF_AUTO_OFF);
}
bool vfio_device_hiod_create_and_realize(VFIODevice *vbasedev,
const char *typename, Error **errp)
{

6
hw/vfio/migration.c

@ -1210,8 +1210,7 @@ bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp)
return !vfio_block_migration(vbasedev, err, errp);
}
if ((!vbasedev->dirty_pages_supported ||
vbasedev->device_dirty_page_tracking == ON_OFF_AUTO_OFF) &&
if (vfio_device_dirty_pages_disabled(vbasedev) &&
!vbasedev->iommu_dirty_tracking) {
if (vbasedev->enable_migration == ON_OFF_AUTO_AUTO) {
error_setg(&err,
@ -1236,7 +1235,8 @@ bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp)
goto out_deinit;
}
if (vfio_viommu_preset(vbasedev)) {
if (!vfio_device_dirty_pages_disabled(vbasedev) &&
vfio_viommu_preset(vbasedev)) {
error_setg(&err, "%s: Migration is currently not supported "
"with vIOMMU enabled", vbasedev->name);
goto add_blocker;

10
include/hw/vfio/vfio-device.h

@ -148,6 +148,16 @@ bool vfio_device_irq_set_signaling(VFIODevice *vbasedev, int index, int subindex
void vfio_device_reset_handler(void *opaque);
bool vfio_device_is_mdev(VFIODevice *vbasedev);
/**
* vfio_device_dirty_pages_disabled: Check if device dirty tracking will be
* used for a VFIO device
*
* @vbasedev: The VFIODevice to transform
*
* Return: true if either @vbasedev doesn't support device dirty tracking or
* is forcedly disabled from command line, otherwise false.
*/
bool vfio_device_dirty_pages_disabled(VFIODevice *vbasedev);
bool vfio_device_hiod_create_and_realize(VFIODevice *vbasedev,
const char *typename, Error **errp);
bool vfio_device_attach(char *name, VFIODevice *vbasedev,

Loading…
Cancel
Save