On 3/4/25 23:03, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> This property allows configuring whether to transfer the particular device
> state via multifd channels when live migrating that device.
>
> It defaults to AUTO, which means that VFIO device state transfer via
> multifd channels is attempted in configurations that otherwise support it.
>
> 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 | 18 +++++++++++++++++-
> hw/vfio/pci.c | 8 ++++++++
> include/hw/vfio/vfio-common.h | 2 ++
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/hw/vfio/migration-multifd.c b/hw/vfio/migration-multifd.c
> index bfb9a72fa450..aacddc503bb8 100644
> --- a/hw/vfio/migration-multifd.c
> +++ b/hw/vfio/migration-multifd.c
> @@ -476,18 +476,34 @@ bool vfio_multifd_transfer_supported(void)
>
> bool vfio_multifd_transfer_enabled(VFIODevice *vbasedev)
> {
> - return false;
> + VFIOMigration *migration = vbasedev->migration;
> +
> + return migration->multifd_transfer;
> }
>
> bool vfio_multifd_setup(VFIODevice *vbasedev, bool alloc_multifd, Error **errp)
> {
> VFIOMigration *migration = vbasedev->migration;
>
> + if (vbasedev->migration_multifd_transfer == ON_OFF_AUTO_AUTO) {
> + migration->multifd_transfer = vfio_multifd_transfer_supported();
> + } else {
> + migration->multifd_transfer =
> + vbasedev->migration_multifd_transfer == ON_OFF_AUTO_ON;
> + }
> +
> if (!vfio_multifd_transfer_enabled(vbasedev)) {
> /* Nothing further to check or do */
> return true;
> }
>
> + if (!vfio_multifd_transfer_supported()) {
> + error_setg(errp,
> + "%s: Multifd device transfer requested but unsupported in the current config",
> + vbasedev->name);
> + return false;
> + }
> +
> if (alloc_multifd) {
> assert(!migration->multifd);
> migration->multifd = vfio_multifd_new();
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index 89d900e9cf0c..6d6f889f59c5 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -3377,6 +3377,9 @@ static const Property vfio_pci_dev_properties[] = {
> VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT, false),
> DEFINE_PROP_ON_OFF_AUTO("enable-migration", VFIOPCIDevice,
> vbasedev.enable_migration, ON_OFF_AUTO_AUTO),
> + DEFINE_PROP_ON_OFF_AUTO("x-migration-multifd-transfer", VFIOPCIDevice,
> + vbasedev.migration_multifd_transfer,
> + ON_OFF_AUTO_AUTO),
> DEFINE_PROP_BOOL("migration-events", VFIOPCIDevice,
> vbasedev.migration_events, false),
> DEFINE_PROP_BOOL("x-no-mmap", VFIOPCIDevice, vbasedev.no_mmap, false),
> @@ -3433,6 +3436,11 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, void *data)
> pdc->exit = vfio_exitfn;
> pdc->config_read = vfio_pci_read_config;
> pdc->config_write = vfio_pci_write_config;
> +
> + object_class_property_set_description(klass, /* 10.0 */
> + "x-migration-multifd-transfer",
> + "Transfer this device state via "
> + "multifd channels when live migrating it");
> }
>
> static const TypeInfo vfio_pci_dev_info = {
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index 961931d9f457..04b123a6c929 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -91,6 +91,7 @@ typedef struct VFIOMigration {
> uint64_t mig_flags;
> uint64_t precopy_init_size;
> uint64_t precopy_dirty_size;
> + bool multifd_transfer;
> VFIOMultifd *multifd;
> bool initial_data_sent;
>
> @@ -153,6 +154,7 @@ typedef struct VFIODevice {
> bool no_mmap;
> bool ram_block_discard_allowed;
> OnOffAuto enable_migration;
> + OnOffAuto migration_multifd_transfer;
> bool migration_events;
> VFIODeviceOps *ops;
> unsigned int num_irqs;
>