mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00

Add a thread which loads the VFIO device state buffers that were received via multifd. Each VFIO device that has multifd device state transfer enabled has one such thread, which is created using migration core API qemu_loadvm_start_load_thread(). Since it's important to finish loading device state transferred via the main migration channel (via save_live_iterate SaveVMHandler) before starting loading the data asynchronously transferred via multifd the thread doing the actual loading of the multifd transferred data is only started from switchover_start SaveVMHandler. switchover_start handler is called when MIG_CMD_SWITCHOVER_START sub-command of QEMU_VM_COMMAND is received via the main migration channel. This sub-command is only sent after all save_live_iterate data have already been posted so it is safe to commence loading of the multifd-transferred device state upon receiving it - loading of save_live_iterate data happens synchronously in the main migration thread (much like the processing of MIG_CMD_SWITCHOVER_START) so by the time MIG_CMD_SWITCHOVER_START is processed all the proceeding data must have already been loaded. Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Link: https://lore.kernel.org/qemu-devel/9abe612d775aaf42e31646796acd2363c723a57a.1741124640.git.maciej.szmigiero@oracle.com [ clg: - Reordered savevm_vfio_handlers - Added switchover_start documentation ] Signed-off-by: Cédric Le Goater <clg@redhat.com>
28 lines
812 B
C
28 lines
812 B
C
/*
|
|
* Multifd VFIO migration
|
|
*
|
|
* Copyright (C) 2024,2025 Oracle and/or its affiliates.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#ifndef HW_VFIO_MIGRATION_MULTIFD_H
|
|
#define HW_VFIO_MIGRATION_MULTIFD_H
|
|
|
|
#include "hw/vfio/vfio-common.h"
|
|
|
|
bool vfio_multifd_setup(VFIODevice *vbasedev, bool alloc_multifd, Error **errp);
|
|
void vfio_multifd_cleanup(VFIODevice *vbasedev);
|
|
|
|
bool vfio_multifd_transfer_supported(void);
|
|
bool vfio_multifd_transfer_enabled(VFIODevice *vbasedev);
|
|
|
|
bool vfio_multifd_load_state_buffer(void *opaque, char *data, size_t data_size,
|
|
Error **errp);
|
|
|
|
int vfio_multifd_switchover_start(VFIODevice *vbasedev);
|
|
|
|
#endif
|