Message ID | f2f2d66bda477da3e6cb8c0311006cff36e8651d.1741124640.git.maciej.szmigiero@oracle.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Multifd | expand |
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); > } >
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); }