mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
vfio queue:
* Small downtime optimisation for VFIO migration * P2P support for VFIO migration * Introduction of a save_prepare() handler to fail VFIO migration * Fix on DMA logging ranges calculation for OVMF enabling dynamic window -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmT+uZQACgkQUaNDx8/7 7KGFSw//UIqSet6MUxZZh/t7yfNFUTnxx6iPdChC3BphBaDDh99FCQrw5mPZ8ImF 4rz0cIwSaHXraugEsC42TDaGjEmcAmYD0Crz+pSpLU21nKtYyWtZy6+9kyYslMNF bUq0UwD0RGTP+ZZi6GBy1hM30y/JbNAGeC6uX8kyJRuK5Korfzoa/X5h+B2XfouW 78G1mARHq5eOkGy91+rAJowdjqtkpKrzkfCJu83330Bb035qAT/PEzGs5LxdfTla ORNqWHy3W+d8ZBicBQ5vwrk6D5JIZWma7vdXJRhs1wGO615cuyt1L8nWLFr8klW5 MJl+wM7DZ6UlSODq7r839GtSuWAnQc2j7JKc+iqZuBBk1v9fGXv2tZmtuTGkG2hN nYXSQfuq1igu1nGVdxJv6WorDxsK9wzLNO2ckrOcKTT28RFl8oCDNSPPTKpwmfb5 i5RrGreeXXqRXIw0VHhq5EqpROLjAFwE9tkJndO8765Ag154plxssaKTUWo5wm7/ kjQVuRuhs5nnMXfL9ixLZkwD1aFn5fWAIaR0psH5vGD0fnB1Pba+Ux9ZzHvxp5D8 Kg3H6dKlht6VXdQ/qb0Up1LXCGEa70QM6Th2iO924ydZkkmqrSj+CFwGHvBsINa4 89fYd77nbRbdwWurj3JIznJYVipau2PmfbjZ/jTed4RxjBQ+fPA= =44e0 -----END PGP SIGNATURE----- Merge tag 'pull-vfio-20230911' of https://github.com/legoater/qemu into staging vfio queue: * Small downtime optimisation for VFIO migration * P2P support for VFIO migration * Introduction of a save_prepare() handler to fail VFIO migration * Fix on DMA logging ranges calculation for OVMF enabling dynamic window # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEEoPZlSPBIlev+awtgUaNDx8/77KEFAmT+uZQACgkQUaNDx8/7 # 7KGFSw//UIqSet6MUxZZh/t7yfNFUTnxx6iPdChC3BphBaDDh99FCQrw5mPZ8ImF # 4rz0cIwSaHXraugEsC42TDaGjEmcAmYD0Crz+pSpLU21nKtYyWtZy6+9kyYslMNF # bUq0UwD0RGTP+ZZi6GBy1hM30y/JbNAGeC6uX8kyJRuK5Korfzoa/X5h+B2XfouW # 78G1mARHq5eOkGy91+rAJowdjqtkpKrzkfCJu83330Bb035qAT/PEzGs5LxdfTla # ORNqWHy3W+d8ZBicBQ5vwrk6D5JIZWma7vdXJRhs1wGO615cuyt1L8nWLFr8klW5 # MJl+wM7DZ6UlSODq7r839GtSuWAnQc2j7JKc+iqZuBBk1v9fGXv2tZmtuTGkG2hN # nYXSQfuq1igu1nGVdxJv6WorDxsK9wzLNO2ckrOcKTT28RFl8oCDNSPPTKpwmfb5 # i5RrGreeXXqRXIw0VHhq5EqpROLjAFwE9tkJndO8765Ag154plxssaKTUWo5wm7/ # kjQVuRuhs5nnMXfL9ixLZkwD1aFn5fWAIaR0psH5vGD0fnB1Pba+Ux9ZzHvxp5D8 # Kg3H6dKlht6VXdQ/qb0Up1LXCGEa70QM6Th2iO924ydZkkmqrSj+CFwGHvBsINa4 # 89fYd77nbRbdwWurj3JIznJYVipau2PmfbjZ/jTed4RxjBQ+fPA= # =44e0 # -----END PGP SIGNATURE----- # gpg: Signature made Mon 11 Sep 2023 02:54:12 EDT # gpg: using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1 # gpg: Good signature from "Cédric Le Goater <clg@redhat.com>" [unknown] # gpg: aka "Cédric Le Goater <clg@kaod.org>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: A0F6 6548 F048 95EB FE6B 0B60 51A3 43C7 CFFB ECA1 * tag 'pull-vfio-20230911' of https://github.com/legoater/qemu: vfio/common: Separate vfio-pci ranges vfio/migration: Block VFIO migration with background snapshot vfio/migration: Block VFIO migration with postcopy migration migration: Add .save_prepare() handler to struct SaveVMHandlers migration: Move more initializations to migrate_init() vfio/migration: Fail adding device with enable-migration=on and existing blocker migration: Add migration prefix to functions in target.c vfio/migration: Allow migration of multiple P2P supporting devices vfio/migration: Add P2P support for VFIO migration vfio/migration: Refactor PRE_COPY and RUNNING state checks qdev: Add qdev_add_vm_change_state_handler_full() sysemu: Add prepare callback to struct VMChangeStateEntry vfio/migration: Move from STOP_COPY to STOP in vfio_save_cleanup() Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
9ef497755a
14 changed files with 377 additions and 99 deletions
|
@ -23,9 +23,21 @@ and recommends that the initial bytes are sent and loaded in the destination
|
|||
before stopping the source VM. Enabling this migration capability will
|
||||
guarantee that and thus, can potentially reduce downtime even further.
|
||||
|
||||
Note that currently VFIO migration is supported only for a single device. This
|
||||
is due to VFIO migration's lack of P2P support. However, P2P support is planned
|
||||
to be added later on.
|
||||
To support migration of multiple devices that might do P2P transactions between
|
||||
themselves, VFIO migration uAPI defines an intermediate P2P quiescent state.
|
||||
While in the P2P quiescent state, P2P DMA transactions cannot be initiated by
|
||||
the device, but the device can respond to incoming ones. Additionally, all
|
||||
outstanding P2P transactions are guaranteed to have been completed by the time
|
||||
the device enters this state.
|
||||
|
||||
All the devices that support P2P migration are first transitioned to the P2P
|
||||
quiescent state and only then are they stopped or started. This makes migration
|
||||
safe P2P-wise, since starting and stopping the devices is not done atomically
|
||||
for all the devices together.
|
||||
|
||||
Thus, multiple VFIO devices migration is allowed only if all the devices
|
||||
support P2P migration. Single VFIO device migration is allowed regardless of
|
||||
P2P migration support.
|
||||
|
||||
A detailed description of the UAPI for VFIO device migration can be found in
|
||||
the comment for the ``vfio_device_mig_state`` structure in the header file
|
||||
|
@ -132,54 +144,63 @@ will be blocked.
|
|||
Flow of state changes during Live migration
|
||||
===========================================
|
||||
|
||||
Below is the flow of state change during live migration.
|
||||
Below is the state change flow during live migration for a VFIO device that
|
||||
supports both precopy and P2P migration. The flow for devices that don't
|
||||
support it is similar, except that the relevant states for precopy and P2P are
|
||||
skipped.
|
||||
The values in the parentheses represent the VM state, the migration state, and
|
||||
the VFIO device state, respectively.
|
||||
The text in the square brackets represents the flow if the VFIO device supports
|
||||
pre-copy.
|
||||
|
||||
Live migration save path
|
||||
------------------------
|
||||
|
||||
::
|
||||
|
||||
QEMU normal running state
|
||||
(RUNNING, _NONE, _RUNNING)
|
||||
|
|
||||
QEMU normal running state
|
||||
(RUNNING, _NONE, _RUNNING)
|
||||
|
|
||||
migrate_init spawns migration_thread
|
||||
Migration thread then calls each device's .save_setup()
|
||||
(RUNNING, _SETUP, _RUNNING [_PRE_COPY])
|
||||
|
|
||||
(RUNNING, _ACTIVE, _RUNNING [_PRE_COPY])
|
||||
If device is active, get pending_bytes by .state_pending_{estimate,exact}()
|
||||
If total pending_bytes >= threshold_size, call .save_live_iterate()
|
||||
[Data of VFIO device for pre-copy phase is copied]
|
||||
Iterate till total pending bytes converge and are less than threshold
|
||||
|
|
||||
On migration completion, vCPU stops and calls .save_live_complete_precopy for
|
||||
each active device. The VFIO device is then transitioned into _STOP_COPY state
|
||||
(FINISH_MIGRATE, _DEVICE, _STOP_COPY)
|
||||
|
|
||||
For the VFIO device, iterate in .save_live_complete_precopy until
|
||||
pending data is 0
|
||||
(FINISH_MIGRATE, _DEVICE, _STOP)
|
||||
|
|
||||
(FINISH_MIGRATE, _COMPLETED, _STOP)
|
||||
Migraton thread schedules cleanup bottom half and exits
|
||||
Migration thread then calls each device's .save_setup()
|
||||
(RUNNING, _SETUP, _PRE_COPY)
|
||||
|
|
||||
(RUNNING, _ACTIVE, _PRE_COPY)
|
||||
If device is active, get pending_bytes by .state_pending_{estimate,exact}()
|
||||
If total pending_bytes >= threshold_size, call .save_live_iterate()
|
||||
Data of VFIO device for pre-copy phase is copied
|
||||
Iterate till total pending bytes converge and are less than threshold
|
||||
|
|
||||
On migration completion, the vCPUs and the VFIO device are stopped
|
||||
The VFIO device is first put in P2P quiescent state
|
||||
(FINISH_MIGRATE, _ACTIVE, _PRE_COPY_P2P)
|
||||
|
|
||||
Then the VFIO device is put in _STOP_COPY state
|
||||
(FINISH_MIGRATE, _ACTIVE, _STOP_COPY)
|
||||
.save_live_complete_precopy() is called for each active device
|
||||
For the VFIO device, iterate in .save_live_complete_precopy() until
|
||||
pending data is 0
|
||||
|
|
||||
(POSTMIGRATE, _COMPLETED, _STOP_COPY)
|
||||
Migraton thread schedules cleanup bottom half and exits
|
||||
|
|
||||
.save_cleanup() is called
|
||||
(POSTMIGRATE, _COMPLETED, _STOP)
|
||||
|
||||
Live migration resume path
|
||||
--------------------------
|
||||
|
||||
::
|
||||
|
||||
Incoming migration calls .load_setup for each device
|
||||
(RESTORE_VM, _ACTIVE, _STOP)
|
||||
|
|
||||
For each device, .load_state is called for that device section data
|
||||
(RESTORE_VM, _ACTIVE, _RESUMING)
|
||||
|
|
||||
At the end, .load_cleanup is called for each device and vCPUs are started
|
||||
(RUNNING, _NONE, _RUNNING)
|
||||
Incoming migration calls .load_setup() for each device
|
||||
(RESTORE_VM, _ACTIVE, _STOP)
|
||||
|
|
||||
For each device, .load_state() is called for that device section data
|
||||
(RESTORE_VM, _ACTIVE, _RESUMING)
|
||||
|
|
||||
At the end, .load_cleanup() is called for each device and vCPUs are started
|
||||
The VFIO device is first put in P2P quiescent state
|
||||
(RUNNING, _ACTIVE, _RUNNING_P2P)
|
||||
|
|
||||
(RUNNING, _NONE, _RUNNING)
|
||||
|
||||
Postcopy
|
||||
========
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue