qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V4 00/43] Live update: vfio and iommufd
@ 2025-05-29 19:23 Steve Sistare
  2025-05-29 19:23 ` [PATCH V4 01/43] MAINTAINERS: Add reviewer for CPR Steve Sistare
                   ` (44 more replies)
  0 siblings, 45 replies; 90+ messages in thread
From: Steve Sistare @ 2025-05-29 19:23 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alex Williamson, Cedric Le Goater, Yi Liu, Eric Auger,
	Zhenzhong Duan, Michael S. Tsirkin, Marcel Apfelbaum, Peter Xu,
	Fabiano Rosas, Steve Sistare

Support vfio and iommufd devices with the cpr-transfer live migration mode.
Devices that do not support live migration can still support cpr-transfer,
allowing live update to a new version of QEMU on the same host, with no loss
of guest connectivity.

No user-visible interfaces are added.

For legacy containers:

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

Use VFIO_DMA_UNMAP_FLAG_VADDR to abandon the old VA's for DMA mapped
regions, and use VFIO_DMA_MAP_FLAG_VADDR to register the new VA in new
QEMU and update the locked memory accounting.  The physical pages remain
pinned, because the descriptor of the device that locked them remains open,
so DMA to those pages continues without interruption.  Mediated devices are
not supported, however, because they require the VA to always be valid, and
there is a brief window where no VA is registered.

Save the MSI message area as part of vfio-pci vmstate, and pass the interrupt
and notifier eventfd's to new QEMU.  New QEMU loads the MSI data, then the
vfio-pci post_load handler finds the eventfds in CPR state, rebuilds vector
data structures, and attaches the interrupts to the new KVM instance.  This
logic also applies to iommufd containers.

For iommufd containers:

Use IOMMU_IOAS_MAP_FILE to register memory regions for DMA when they are
backed by a file (including a memfd), so DMA mappings do not depend on VA,
which can differ after live update.  This allows mediated devices to be
supported.

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 mm ownership and
locked memory accounting.

Patches 4 to 12 are specific to legacy containers.
Patches 25 to 41 are specific to iommufd containers.
The remainder apply to both.

Changes from previous versions:
  * V1 of this series contains minor changes from the "Live update: vfio" and
    "Live update: iommufd" series, mainly bug fixes and refactored patches.

Changes in V2:
  * refactored various vfio code snippets into new cpr helpers
  * refactored vfio struct members into cpr-specific structures
  * refactored various small changes into their own patches
  * split complex patches.  Notably:
    - split "refactor for cpr" into 5 patches
    - split "reconstruct device" into 4 patches
  * refactored vfio_connect_container using helpers and made its
    error recovery more robust.
  * moved vfio pci msi/vector/intx cpr functions to cpr.c
  * renamed "reused" to cpr_reused and cpr.reused
  * squashed vfio_cpr_[un]register_container to their call sites
  * simplified iommu_type setting after cpr
  * added cpr_open_fd and cpr_is_incoming helpers
  * removed changes from vfio_legacy_dma_map, and instead temporarily
    override dma_map and dma_unmap ops.
  * deleted error_report and returned Error to callers where possible.
  * simplified the memory_get_xlat_addr interface
  * fixed flags passed to iommufd_backend_alloc_hwpt
  * defined MIG_PRI_UNINITIALIZED
  * added maintainers

Changes in V3:
  * removed cleanup patches that were already pulled
  * rebased to latest master

Changes in V4:
  * added SPDX-License-Identifier
  * patch "vfio/container: preserve descriptors"
    - rewrote search loop in vfio_container_connect
    - do not return pfd from vfio_cpr_container_match
    - add helper for VFIO_GROUP_GET_DEVICE_FD
  * deleted patch "export vfio_legacy_dma_map"
  * patch "vfio/container: restore DMA vaddr"
    - deleted redundant error_report from vfio_legacy_cpr_dma_map
    - save old dma_map function
  * patch "vfio-pci: skip reset during cpr"
    - use cpr_is_incoming instead of cpr_reused
  * renamed err -> local_err in all new code
  * patch "export MSI functions"
    -  renamed with vfio_pci prefix, and defined wrappers for low level
       routines instead of exporting them.
  * patch "close kvm after cpr"
    - fixed build error for !CONFIG_KVM
  * added the cpr_resave_fd helper
  * dropped patch "pass ramblock to vfio_container_dma_map", relying on
    "pass MemoryRegion" from the vfio-user series instead.
  * deleted "reused" variables, replaced with cpr_is_incoming()
  * renamed cpr_needed_for_reuse -> cpr_incoming_needed
  * rewrote patch "pci: skip reset during cpr"
  * rebased to latest master

  for iommufd:
    * deleted redundant error_report from iommufd_backend_map_file_dma
    * added interface doc for dma_map_file
    * check return value of cpr_open_fd
    * deleted "export iommufd_cdev_get_info_iova_range"
    * deleted "reconstruct device"
    * deleted "reconstruct hw_caps"
    * deleted "define hwpt constructors"
    * seperated cpr registration for iommufd be and vfio container
    * correctly attach to multiple containers per iommufd using ioas_id
    * simplified "reconstruct hwpt" by matching against hwpt_id.
    * added patch "add vfio_device_free_name"


Steve Sistare (43):
  MAINTAINERS: Add reviewer for CPR
  vfio: return mr from vfio_get_xlat_addr
  vfio/container: pass MemoryRegion to DMA operations
  vfio/pci: vfio_pci_put_device on failure
  migration: cpr helpers
  migration: lower handler priority
  vfio: vfio_find_ram_discard_listener
  vfio: move vfio-cpr.h
  vfio/container: register container for cpr
  vfio/container: preserve descriptors
  vfio/container: discard old DMA vaddr
  vfio/container: restore DMA vaddr
  vfio/container: mdev cpr blocker
  vfio/container: recover from unmap-all-vaddr failure
  pci: export msix_is_pending
  pci: skip reset during cpr
  vfio-pci: skip reset during cpr
  vfio/pci: vfio_pci_vector_init
  vfio/pci: vfio_notifier_init
  vfio/pci: pass vector to virq functions
  vfio/pci: vfio_notifier_init cpr parameters
  vfio/pci: vfio_notifier_cleanup
  vfio/pci: export MSI functions
  vfio-pci: preserve MSI
  vfio-pci: preserve INTx
  migration: close kvm after cpr
  migration: cpr_get_fd_param helper
  backends/iommufd: iommufd_backend_map_file_dma
  backends/iommufd: change process ioctl
  physmem: qemu_ram_get_fd_offset
  vfio/iommufd: use IOMMU_IOAS_MAP_FILE
  vfio/iommufd: invariant device name
  vfio/iommufd: add vfio_device_free_name
  vfio/iommufd: device name blocker
  vfio/iommufd: register container for cpr
  migration: vfio cpr state hook
  vfio/iommufd: cpr state
  vfio/iommufd: preserve descriptors
  vfio/iommufd: reconstruct device
  vfio/iommufd: reconstruct hwpt
  vfio/iommufd: change process
  iommufd: preserve DMA mappings
  vfio/container: delete old cpr register

 MAINTAINERS                           |  10 ++
 hw/vfio/pci.h                         |  10 ++
 hw/vfio/vfio-cpr.h                    |  15 --
 include/exec/cpu-common.h             |   1 +
 include/hw/pci/msix.h                 |   1 +
 include/hw/pci/pci_device.h           |   3 +
 include/hw/vfio/vfio-container-base.h |  38 ++++-
 include/hw/vfio/vfio-container.h      |   2 +
 include/hw/vfio/vfio-cpr.h            |  78 +++++++++
 include/hw/vfio/vfio-device.h         |   5 +
 include/migration/cpr.h               |  21 +++
 include/migration/vmstate.h           |   6 +-
 include/system/iommufd.h              |   6 +
 include/system/kvm.h                  |   1 +
 include/system/memory.h               |  19 ++-
 accel/kvm/kvm-all.c                   |  28 ++++
 accel/stubs/kvm-stub.c                |   5 +
 backends/iommufd.c                    | 101 +++++++++++-
 hw/pci/msix.c                         |   2 +-
 hw/pci/pci.c                          |   5 +
 hw/vfio/ap.c                          |   2 +-
 hw/vfio/ccw.c                         |   2 +-
 hw/vfio/container-base.c              |  13 +-
 hw/vfio/container.c                   | 101 +++++++++---
 hw/vfio/cpr-iommufd.c                 | 220 ++++++++++++++++++++++++++
 hw/vfio/cpr-legacy.c                  | 288 ++++++++++++++++++++++++++++++++++
 hw/vfio/cpr.c                         | 161 +++++++++++++++++--
 hw/vfio/device.c                      |  40 +++--
 hw/vfio/helpers.c                     |  10 ++
 hw/vfio/iommufd.c                     |  86 ++++++++--
 hw/vfio/listener.c                    |  93 +++++++----
 hw/vfio/pci.c                         | 232 ++++++++++++++++++++-------
 hw/vfio/platform.c                    |   2 +-
 hw/vfio/vfio-stubs.c                  |  13 ++
 hw/virtio/vhost-vdpa.c                |   9 +-
 migration/cpr-transfer.c              |  18 +++
 migration/cpr.c                       |  95 +++++++++--
 migration/migration.c                 |   1 +
 migration/savevm.c                    |   4 +-
 system/memory.c                       |  32 +---
 system/physmem.c                      |   5 +
 backends/trace-events                 |   2 +
 hw/vfio/meson.build                   |   4 +
 43 files changed, 1576 insertions(+), 214 deletions(-)
 delete mode 100644 hw/vfio/vfio-cpr.h
 create mode 100644 include/hw/vfio/vfio-cpr.h
 create mode 100644 hw/vfio/cpr-iommufd.c
 create mode 100644 hw/vfio/cpr-legacy.c
 create mode 100644 hw/vfio/vfio-stubs.c

base-commit: d2e9b78162e31b1eaf20f3a4f563da82da56908d
-- 
1.8.3.1



^ permalink raw reply	[flat|nested] 90+ messages in thread

end of thread, other threads:[~2025-06-10 17:19 UTC | newest]

Thread overview: 90+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-29 19:23 [PATCH V4 00/43] Live update: vfio and iommufd Steve Sistare
2025-05-29 19:23 ` [PATCH V4 01/43] MAINTAINERS: Add reviewer for CPR Steve Sistare
2025-05-29 19:23 ` [PATCH V4 02/43] vfio: return mr from vfio_get_xlat_addr Steve Sistare
2025-06-03 10:39   ` Duan, Zhenzhong
2025-05-29 19:23 ` [PATCH V4 03/43] vfio/container: pass MemoryRegion to DMA operations Steve Sistare
2025-06-03 10:39   ` Duan, Zhenzhong
2025-05-29 19:24 ` [PATCH V4 04/43] vfio/pci: vfio_pci_put_device on failure Steve Sistare
2025-06-03 10:40   ` Duan, Zhenzhong
2025-06-03 14:09     ` Steven Sistare
2025-06-04  3:55       ` Duan, Zhenzhong
2025-06-04 13:33         ` Steven Sistare
2025-06-05  3:02           ` Duan, Zhenzhong
2025-06-05 15:16             ` Steven Sistare
2025-06-05 21:14               ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 05/43] migration: cpr helpers Steve Sistare
2025-05-29 19:24 ` [PATCH V4 06/43] migration: lower handler priority Steve Sistare
2025-05-29 19:24 ` [PATCH V4 07/43] vfio: vfio_find_ram_discard_listener Steve Sistare
2025-06-03 10:59   ` Duan, Zhenzhong
2025-05-29 19:24 ` [PATCH V4 08/43] vfio: move vfio-cpr.h Steve Sistare
2025-06-03 11:01   ` Duan, Zhenzhong
2025-05-29 19:24 ` [PATCH V4 09/43] vfio/container: register container for cpr Steve Sistare
2025-06-01 15:21   ` Cédric Le Goater
2025-06-03 11:57   ` Duan, Zhenzhong
2025-06-03 14:09     ` Steven Sistare
2025-06-03 14:17       ` Steven Sistare
2025-06-03 15:27         ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 10/43] vfio/container: preserve descriptors Steve Sistare
2025-06-01 16:57   ` Cédric Le Goater
2025-06-03 11:57   ` Duan, Zhenzhong
2025-05-29 19:24 ` [PATCH V4 11/43] vfio/container: discard old DMA vaddr Steve Sistare
2025-05-29 19:24 ` [PATCH V4 12/43] vfio/container: restore " Steve Sistare
2025-06-01 16:48   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 13/43] vfio/container: mdev cpr blocker Steve Sistare
2025-05-29 19:24 ` [PATCH V4 14/43] vfio/container: recover from unmap-all-vaddr failure Steve Sistare
2025-05-29 19:24 ` [PATCH V4 15/43] pci: export msix_is_pending Steve Sistare
2025-05-29 19:24 ` [PATCH V4 16/43] pci: skip reset during cpr Steve Sistare
2025-06-01 16:38   ` Cédric Le Goater
2025-06-01 19:07     ` Michael S. Tsirkin
2025-06-02 12:36       ` Steven Sistare
2025-06-04  7:09         ` Cédric Le Goater
2025-06-04 11:59           ` Cédric Le Goater
2025-06-04 13:15             ` Steven Sistare
2025-06-04 13:48               ` Cédric Le Goater
2025-06-10 16:31                 ` Michael S. Tsirkin
2025-06-10 17:05                   ` Steven Sistare
2025-06-10 17:11                     ` Cédric Le Goater
2025-06-10 17:14                       ` Steven Sistare
2025-06-10 17:19                         ` Cédric Le Goater
2025-06-10 17:09                   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 17/43] vfio-pci: " Steve Sistare
2025-06-01 16:39   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 18/43] vfio/pci: vfio_pci_vector_init Steve Sistare
2025-06-01 15:25   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 19/43] vfio/pci: vfio_notifier_init Steve Sistare
2025-05-29 19:24 ` [PATCH V4 20/43] vfio/pci: pass vector to virq functions Steve Sistare
2025-05-29 19:24 ` [PATCH V4 21/43] vfio/pci: vfio_notifier_init cpr parameters Steve Sistare
2025-05-29 19:24 ` [PATCH V4 22/43] vfio/pci: vfio_notifier_cleanup Steve Sistare
2025-05-29 19:24 ` [PATCH V4 23/43] vfio/pci: export MSI functions Steve Sistare
2025-06-01 15:27   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 24/43] vfio-pci: preserve MSI Steve Sistare
2025-05-29 19:24 ` [PATCH V4 25/43] vfio-pci: preserve INTx Steve Sistare
2025-05-29 19:24 ` [PATCH V4 26/43] migration: close kvm after cpr Steve Sistare
2025-05-29 19:24 ` [PATCH V4 27/43] migration: cpr_get_fd_param helper Steve Sistare
2025-05-29 19:24 ` [PATCH V4 28/43] backends/iommufd: iommufd_backend_map_file_dma Steve Sistare
2025-05-29 19:24 ` [PATCH V4 29/43] backends/iommufd: change process ioctl Steve Sistare
2025-05-29 19:24 ` [PATCH V4 30/43] physmem: qemu_ram_get_fd_offset Steve Sistare
2025-05-29 19:24 ` [PATCH V4 31/43] vfio/iommufd: use IOMMU_IOAS_MAP_FILE Steve Sistare
2025-05-29 19:24 ` [PATCH V4 32/43] vfio/iommufd: invariant device name Steve Sistare
2025-06-10  6:10   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 33/43] vfio/iommufd: add vfio_device_free_name Steve Sistare
2025-06-10  6:12   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 34/43] vfio/iommufd: device name blocker Steve Sistare
2025-05-29 19:24 ` [PATCH V4 35/43] vfio/iommufd: register container for cpr Steve Sistare
2025-06-09 20:30   ` Cédric Le Goater
2025-06-09 20:47     ` Steven Sistare
2025-06-10  6:11       ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 36/43] migration: vfio cpr state hook Steve Sistare
2025-06-10  6:14   ` Cédric Le Goater
2025-05-29 19:24 ` [PATCH V4 37/43] vfio/iommufd: cpr state Steve Sistare
2025-05-29 19:24 ` [PATCH V4 38/43] vfio/iommufd: preserve descriptors Steve Sistare
2025-05-29 19:24 ` [PATCH V4 39/43] vfio/iommufd: reconstruct device Steve Sistare
2025-05-29 19:24 ` [PATCH V4 40/43] vfio/iommufd: reconstruct hwpt Steve Sistare
2025-05-29 19:24 ` [PATCH V4 41/43] vfio/iommufd: change process Steve Sistare
2025-05-29 19:24 ` [PATCH V4 42/43] iommufd: preserve DMA mappings Steve Sistare
2025-05-29 19:24 ` [PATCH V4 43/43] vfio/container: delete old cpr register Steve Sistare
2025-06-10  6:14   ` Cédric Le Goater
2025-06-01 17:26 ` [PATCH V4 00/43] Live update: vfio and iommufd Cédric Le Goater
2025-06-02 12:42   ` Steven Sistare
2025-06-03 12:09 ` Duan, Zhenzhong
2025-06-03 14:09   ` Steven Sistare

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).