Message ID | d6dbb326e3d53c7104d62c96c9e3dd64e1c7b940.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> > > 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; >
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;