On 3/4/25 23:03, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> Add multifd setup/cleanup functions and an associated VFIOMultifd data
> structure that will contain most of the receive-side data together
> with its init/cleanup methods.
>
> Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Reviewed-by: CĂ©dric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
> hw/vfio/migration-multifd.c | 44 +++++++++++++++++++++++++++++++++++
> hw/vfio/migration-multifd.h | 4 ++++
> include/hw/vfio/vfio-common.h | 3 +++
> 3 files changed, 51 insertions(+)
>
> diff --git a/hw/vfio/migration-multifd.c b/hw/vfio/migration-multifd.c
> index 79fae0b6296f..091dc43210ad 100644
> --- a/hw/vfio/migration-multifd.c
> +++ b/hw/vfio/migration-multifd.c
> @@ -32,8 +32,52 @@ typedef struct VFIODeviceStatePacket {
> uint8_t data[0];
> } QEMU_PACKED VFIODeviceStatePacket;
>
> +typedef struct VFIOMultifd {
> +} VFIOMultifd;
> +
> +static VFIOMultifd *vfio_multifd_new(void)
> +{
> + VFIOMultifd *multifd = g_new(VFIOMultifd, 1);
> +
> + return multifd;
> +}
> +
> +static void vfio_multifd_free(VFIOMultifd *multifd)
> +{
> + g_free(multifd);
> +}
> +
> +void vfio_multifd_cleanup(VFIODevice *vbasedev)
> +{
> + VFIOMigration *migration = vbasedev->migration;
> +
> + g_clear_pointer(&migration->multifd, vfio_multifd_free);
> +}
> +
> bool vfio_multifd_transfer_supported(void)
> {
> return multifd_device_state_supported() &&
> migrate_send_switchover_start();
> }
> +
> +bool vfio_multifd_transfer_enabled(VFIODevice *vbasedev)
> +{
> + return false;
> +}
> +
> +bool vfio_multifd_setup(VFIODevice *vbasedev, bool alloc_multifd, Error **errp)
> +{
> + VFIOMigration *migration = vbasedev->migration;
> +
> + if (!vfio_multifd_transfer_enabled(vbasedev)) {
> + /* Nothing further to check or do */
> + return true;
> + }
> +
> + if (alloc_multifd) {
> + assert(!migration->multifd);
> + migration->multifd = vfio_multifd_new();
> + }
> +
> + return true;
> +}
> diff --git a/hw/vfio/migration-multifd.h b/hw/vfio/migration-multifd.h
> index 1b60d5f67a1c..2a7a76164f29 100644
> --- a/hw/vfio/migration-multifd.h
> +++ b/hw/vfio/migration-multifd.h
> @@ -14,6 +14,10 @@
>
> #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);
>
> #endif
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index bf5d52087129..40382390692d 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -78,6 +78,8 @@ typedef struct VFIORegion {
> uint8_t nr; /* cache the region number for debug */
> } VFIORegion;
>
> +typedef struct VFIOMultifd VFIOMultifd;
> +
> typedef struct VFIOMigration {
> struct VFIODevice *vbasedev;
> VMChangeStateEntry *vm_state;
> @@ -89,6 +91,7 @@ typedef struct VFIOMigration {
> uint64_t mig_flags;
> uint64_t precopy_init_size;
> uint64_t precopy_dirty_size;
> + VFIOMultifd *multifd;
> bool initial_data_sent;
>
> bool event_save_iterate_started;
>