hw/net: fix vmxnet3 live migration
At some point vmxnet3 live migration stopped working and git-bisect didn't help finding a working version. The issue is the PCI configuration space is not being migrated successfully and MSIX remains masked at destination. Remove the migration differentiation between PCI and PCIe since the logic resides now inside VMSTATE_PCI_DEVICE. Remove also the VMXNET3_COMPAT_FLAG_DISABLE_PCIE based differentiation since at 'realize' time is decided if the device is PCI or PCIe, then the above macro is enough. Use the opportunity to move to the standard VMSTATE_MSIX instead of the deprecated SaveVMHandlers. Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Message-Id: <20190705010711.23277-1-marcel.apfelbaum@gmail.com> Tested-by: Sukrit Bhatnagar <skrtbhtngr@gmail.com> Reviewed-by: Dmitry Fleytman <dmitry.fleytman@gmail.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
3d661c8ab1
commit
78dd48df39
@ -2141,21 +2141,6 @@ vmxnet3_cleanup_msi(VMXNET3State *s)
|
|||||||
msi_uninit(d);
|
msi_uninit(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
vmxnet3_msix_save(QEMUFile *f, void *opaque)
|
|
||||||
{
|
|
||||||
PCIDevice *d = PCI_DEVICE(opaque);
|
|
||||||
msix_save(d, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
vmxnet3_msix_load(QEMUFile *f, void *opaque, int version_id)
|
|
||||||
{
|
|
||||||
PCIDevice *d = PCI_DEVICE(opaque);
|
|
||||||
msix_load(d, f);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const MemoryRegionOps b0_ops = {
|
static const MemoryRegionOps b0_ops = {
|
||||||
.read = vmxnet3_io_bar0_read,
|
.read = vmxnet3_io_bar0_read,
|
||||||
.write = vmxnet3_io_bar0_write,
|
.write = vmxnet3_io_bar0_write,
|
||||||
@ -2176,11 +2161,6 @@ static const MemoryRegionOps b1_ops = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static SaveVMHandlers savevm_vmxnet3_msix = {
|
|
||||||
.save_state = vmxnet3_msix_save,
|
|
||||||
.load_state = vmxnet3_msix_load,
|
|
||||||
};
|
|
||||||
|
|
||||||
static uint64_t vmxnet3_device_serial_num(VMXNET3State *s)
|
static uint64_t vmxnet3_device_serial_num(VMXNET3State *s)
|
||||||
{
|
{
|
||||||
uint64_t dsn_payload;
|
uint64_t dsn_payload;
|
||||||
@ -2203,7 +2183,6 @@ static uint64_t vmxnet3_device_serial_num(VMXNET3State *s)
|
|||||||
|
|
||||||
static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||||
{
|
{
|
||||||
DeviceState *dev = DEVICE(pci_dev);
|
|
||||||
VMXNET3State *s = VMXNET3(pci_dev);
|
VMXNET3State *s = VMXNET3(pci_dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -2249,8 +2228,6 @@ static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
|
|||||||
pcie_dev_ser_num_init(pci_dev, VMXNET3_DSN_OFFSET,
|
pcie_dev_ser_num_init(pci_dev, VMXNET3_DSN_OFFSET,
|
||||||
vmxnet3_device_serial_num(s));
|
vmxnet3_device_serial_num(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
register_savevm_live(dev, "vmxnet3-msix", -1, 1, &savevm_vmxnet3_msix, s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vmxnet3_instance_init(Object *obj)
|
static void vmxnet3_instance_init(Object *obj)
|
||||||
@ -2440,29 +2417,6 @@ static const VMStateDescription vmstate_vmxnet3_int_state = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool vmxnet3_vmstate_need_pcie_device(void *opaque)
|
|
||||||
{
|
|
||||||
VMXNET3State *s = VMXNET3(opaque);
|
|
||||||
|
|
||||||
return !(s->compat_flags & VMXNET3_COMPAT_FLAG_DISABLE_PCIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool vmxnet3_vmstate_test_pci_device(void *opaque, int version_id)
|
|
||||||
{
|
|
||||||
return !vmxnet3_vmstate_need_pcie_device(opaque);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_vmxnet3_pcie_device = {
|
|
||||||
.name = "vmxnet3/pcie",
|
|
||||||
.version_id = 1,
|
|
||||||
.minimum_version_id = 1,
|
|
||||||
.needed = vmxnet3_vmstate_need_pcie_device,
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_PCI_DEVICE(parent_obj, VMXNET3State),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_vmxnet3 = {
|
static const VMStateDescription vmstate_vmxnet3 = {
|
||||||
.name = "vmxnet3",
|
.name = "vmxnet3",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
@ -2470,9 +2424,8 @@ static const VMStateDescription vmstate_vmxnet3 = {
|
|||||||
.pre_save = vmxnet3_pre_save,
|
.pre_save = vmxnet3_pre_save,
|
||||||
.post_load = vmxnet3_post_load,
|
.post_load = vmxnet3_post_load,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_STRUCT_TEST(parent_obj, VMXNET3State,
|
VMSTATE_PCI_DEVICE(parent_obj, VMXNET3State),
|
||||||
vmxnet3_vmstate_test_pci_device, 0,
|
VMSTATE_MSIX(parent_obj, VMXNET3State),
|
||||||
vmstate_pci_device, PCIDevice),
|
|
||||||
VMSTATE_BOOL(rx_packets_compound, VMXNET3State),
|
VMSTATE_BOOL(rx_packets_compound, VMXNET3State),
|
||||||
VMSTATE_BOOL(rx_vlan_stripping, VMXNET3State),
|
VMSTATE_BOOL(rx_vlan_stripping, VMXNET3State),
|
||||||
VMSTATE_BOOL(lro_supported, VMXNET3State),
|
VMSTATE_BOOL(lro_supported, VMXNET3State),
|
||||||
@ -2508,7 +2461,6 @@ static const VMStateDescription vmstate_vmxnet3 = {
|
|||||||
},
|
},
|
||||||
.subsections = (const VMStateDescription*[]) {
|
.subsections = (const VMStateDescription*[]) {
|
||||||
&vmxstate_vmxnet3_mcast_list,
|
&vmxstate_vmxnet3_mcast_list,
|
||||||
&vmstate_vmxnet3_pcie_device,
|
|
||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user