Support iommufd devices with the cpr-exec live migration mode.
No user-visible interfaces are added.

Pass the iommufd and vfio device descriptors from old to new QEMU.  In new
QEMU, during vfio_realize, skip the ioctls that configure the device, because
it is already configured.

In new QEMU, call ioctl(IOMMU_IOAS_CHANGE_PROCESS) to update the mm ownership,
locked memory accounting, and virtual address of all DMA mappings.  The old
virtual address of each memory region is needed to identify the existing
mapping, so pass the host address of each RAMBlock in the migration data
stream.

Block CPR if the iommufd container has any vfio mdevs (mediated devices).
IOMMU_IOAS_CHANGE_PROCESS can be used as-is to support mdevs, but it requires
extra work in userland at CPR time so that kernel threads have access to the
old mappings until the mappings are updated in new QEMU.  I have prototyped
those changes but they need more work before posting.

This series depends on the following qemu series
  [PATCH V1 00/08] Live update: vfio
  
https://lore.kernel.org/qemu-devel/1720558737-451106-1-git-send-email-steven.sist...@oracle.com/

This series depends on the IOMMU_IOAS_CHANGE_PROCESS kernel interface which
is a work in progress:
  iommufd live update
  
https://lore.kernel.org/linux-iommu/1721501805-86928-1-git-send-email-steven.sist...@oracle.com

Steve Sistare (12):
  vfio: move cpr_exec_notifier
  iommufd: no DMA to BARs
  iommufd: pass name to connect
  migration: cpr_find_fd_any
  iommufd: preserve device fd
  iommufd: export iommufd_cdev_get_info_iova_range
  iommufd: change_process kernel interface
  vfio/iommufd: register container for cpr
  vfio/iommufd: rebuild device
  migration/ram: old host address
  iommufd: update DMA virtual addresses
  vfio: mdev blocker

 backends/iommufd.c                    | 113 ++++++++++++++++++++++++++++++++--
 hw/core/machine.c                     |   6 ++
 hw/vfio/common.c                      |   3 +-
 hw/vfio/cpr-iommufd.c                 |  84 +++++++++++++++++++++++++
 hw/vfio/cpr-legacy.c                  |  10 +--
 hw/vfio/helpers.c                     |   1 +
 hw/vfio/iommufd.c                     |  43 ++++++++++---
 hw/vfio/meson.build                   |   1 +
 hw/vfio/pci.c                         |  10 +++
 include/exec/memory.h                 |   1 +
 include/exec/ramblock.h               |   1 +
 include/hw/vfio/vfio-common.h         |   7 ++-
 include/hw/vfio/vfio-container-base.h |   3 +
 include/migration/cpr.h               |   1 +
 include/sysemu/iommufd.h              |   7 ++-
 linux-headers/linux/iommufd.h         |  19 ++++++
 migration/cpr.c                       |  15 +++++
 migration/migration.h                 |   2 +
 migration/options.c                   |   2 +
 migration/ram.c                       |   7 +++
 20 files changed, 316 insertions(+), 20 deletions(-)
 create mode 100644 hw/vfio/cpr-iommufd.c

-- 
1.8.3.1


Reply via email to