On 3/4/25 23:03, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> DEFINE_PROP_ON_OFF_AUTO() property isn't runtime-mutable so using it
> would mean that the source VM would need to decide upfront at startup
> time whether it wants to do a multifd device state transfer at some
> point.
>
> Source VM can run for a long time before being migrated so it is
> desirable to have a fallback mechanism to the old way of transferring
> VFIO device state if it turns to be necessary.
>
> This brings this property to the same mutability level as ordinary
> migration parameters, which too can be adjusted at the run time.
>
> 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 | 4 ++++
> hw/vfio/pci.c | 20 +++++++++++++++++---
> 2 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/hw/vfio/migration-multifd.c b/hw/vfio/migration-multifd.c
> index aacddc503bb8..233724710b37 100644
> --- a/hw/vfio/migration-multifd.c
> +++ b/hw/vfio/migration-multifd.c
> @@ -485,6 +485,10 @@ bool vfio_multifd_setup(VFIODevice *vbasedev, bool alloc_multifd, Error **errp)
> {
> VFIOMigration *migration = vbasedev->migration;
>
> + /*
> + * Make a copy of this setting at the start in case it is changed
> + * mid-migration.
> + */
> if (vbasedev->migration_multifd_transfer == ON_OFF_AUTO_AUTO) {
> migration->multifd_transfer = vfio_multifd_transfer_supported();
> } else {
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index 6d6f889f59c5..21605bac2fb0 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -3353,6 +3353,8 @@ static void vfio_instance_init(Object *obj)
> pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
> }
>
> +static PropertyInfo vfio_pci_migration_multifd_transfer_prop;
> +
> static const Property vfio_pci_dev_properties[] = {
> DEFINE_PROP_PCI_HOST_DEVADDR("host", VFIOPCIDevice, host),
> DEFINE_PROP_UUID_NODEFAULT("vf-token", VFIOPCIDevice, vf_token),
> @@ -3377,9 +3379,10 @@ 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("x-migration-multifd-transfer", VFIOPCIDevice,
> + vbasedev.migration_multifd_transfer,
> + vfio_pci_migration_multifd_transfer_prop, OnOffAuto,
> + .set_default = true, .defval.i = 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),
> @@ -3480,6 +3483,17 @@ static const TypeInfo vfio_pci_nohotplug_dev_info = {
>
> static void register_vfio_pci_dev_type(void)
> {
> + /*
> + * Ordinary ON_OFF_AUTO property isn't runtime-mutable, but source VM can
> + * run for a long time before being migrated so it is desirable to have a
> + * fallback mechanism to the old way of transferring VFIO device state if
> + * it turns to be necessary.
> + * The following makes this type of property have the same mutability level
> + * as ordinary migration parameters.
> + */
> + vfio_pci_migration_multifd_transfer_prop = qdev_prop_on_off_auto;
> + vfio_pci_migration_multifd_transfer_prop.realized_set_allowed = true;
> +
> type_register_static(&vfio_pci_dev_info);
> type_register_static(&vfio_pci_nohotplug_dev_info);
> }
>