mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:56:38 +00:00
migration: Make switchover-ack re-usable
Switchover-ack is a mechanism to synchronize between source and destination QEMU during migration to prevent the source from switching over prematurely. VFIO uses switchover-ack to ensure switchover happens only after destination side has loaded the precopy initial bytes. This is important for VFIO, as otherwise downtime could be impacted and be higher. In its current state, switchover-ack is a one-time mechanism, meaning that switchover is acked only once and past that another ACK cannot be requested again. This was sufficient until now, as VFIO precopy initial bytes was defined to be monotonically decreasing. Thus, when precopy initial bytes reached zero for all VFIO devices, a single ACK would be sent and its validity would hold. However, now the new VFIO_PRECOPY_INFO_REINIT feature allows precopy initial bytes to be re-initialized during precopy. Specifically, it means that initial bytes can grow after reaching zero, which would invalidate a previously sent switchover ACK. To solve this, make switchover-ack reusable and allow devices to request switchover ACKs when needed via the save_query_pending SaveVMHandler. Since now switchover ACK can be requested for a specific device and in different times, make switchover ACK per-device (instead of a single ACK for all devices) and let source side do the pending ACKs accounting. Keep the legacy switchover-ack mechanism for backward compatibility and turn it on by a compatibility property for older machines. Enable the property until VFIO implements the new switchover-ack. Acked-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Avihai Horon <avihaih@nvidia.com> Link: https://lore.kernel.org/qemu-devel/20260706085211.13905-8-avihaih@nvidia.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
committed by
Cédric Le Goater
parent
d55f1cf24f
commit
de0a1aed07
@@ -13,6 +13,7 @@
|
||||
|
||||
/* properties */
|
||||
bool migrate_send_switchover_start(void);
|
||||
bool migrate_switchover_ack_legacy(void);
|
||||
|
||||
/* capabilities */
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ typedef struct MigPendingData {
|
||||
uint64_t postcopy_bytes;
|
||||
/* Amount of pending bytes can be transferred only in stopcopy */
|
||||
uint64_t stopcopy_bytes;
|
||||
/* Number of new pending switchover ACKs */
|
||||
uint32_t switchover_ack_pending;
|
||||
/*
|
||||
* Total pending data, modules do not need to update this field, it
|
||||
* will be automatically calculated by migration core API.
|
||||
|
||||
Reference in New Issue
Block a user