On 21/07/2021 13:10, Dr. David Alan Gilbert wrote: > * Laurent Vivier ([email protected]) wrote: >> The intend of failover is to allow to migrate a VM with a VFIO >> networking card without disrupting the network operation by switching >> to a virtio-net device during the migration. >> >> This simple change allows to test failover with a simulated device >> like e1000e rather than a vfio device, even if it's useless in real >> life it can help to debug failover. >> >> This is interesting to developers that want to test failover on >> a system with no vfio device. Moreover it simplifies host networking >> configuration as we can use the same bridge for virtio-net and >> the other failover networking device. >> >> Without this change the migration of a system configured with failover >> fails with: >> >> ... >> -device virtio-net-pci,id=virtionet0,failover=on,... \ >> -device e1000,failover_pair_id=virtionet0,... \ >> ... >> >> (qemu) migrate ... >> >> Unknown ramblock "0000:00:01.1:00.0/e1000e.rom", cannot accept migration >> error while loading state for instance 0x0 of device 'ram' >> load of migration failed: Invalid argument >> >> This happens because QEMU correctly unregisters the interface vmstate but >> not the ROM one. This patch fixes that. >> >> Signed-off-by: Laurent Vivier <[email protected]> >> --- >> >> Notes: >> v3: >> remove useless space before comma >> >> v2: >> reset has_rom to false >> update commit log message >> >> hw/net/virtio-net.c | 4 ++++ >> 1 file changed, 4 insertions(+) >> >> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c >> index 16d20cdee52a..c0c2ec1ebb98 100644 >> --- a/hw/net/virtio-net.c >> +++ b/hw/net/virtio-net.c >> @@ -3256,6 +3256,10 @@ static void >> virtio_net_handle_migration_primary(VirtIONet *n, MigrationState *s) >> if (migration_in_setup(s) && !should_be_hidden) { >> if (failover_unplug_primary(n, dev)) { >> vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); >> + if (PCI_DEVICE(dev)->has_rom) { >> + PCI_DEVICE(dev)->has_rom = false; >> + vmstate_unregister_ram(&PCI_DEVICE(dev)->rom, dev); >> + } > > Not actually originated by your fix, but.... > > Why doesn't failover_replug_primary re-add the vmstates?
Good point. I'm going to check but I think the vmstates are re-added by the hotplug operations that are used in failover_replug_primary(). Thanks, Laurent
