device-assignment: Register as un-migratable
PATCH v2 1/1 device-assignment: Register as un-migratable
Use register_device_unmigratable() to declare ourselves as non-migratable.
---
v2: Use dummy vmsd instead of dummy save_state
hw/device-assignment.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
hw/device-assignment.c +10 -0
@@ -1434,6 +1434,10 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev) dev->msix_table_page =NULL ; } +static const VMStateDescription vmstate_assigned_device = { + .name ="pci-assign" +}; +static int assigned_initfn (struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev);
@@ -1490,6 +1494,11 @@ static int assigned_initfn(struct PCIDevice *pci_dev)assigned_dev_load_option_rom (dev);QLIST_INSERT_HEAD (&devs, dev, next); + +/* Register a vmsd so that we can mark it unmigratable. */ +vmstate_register (&dev->dev.qdev,0 , &vmstate_assigned_device, dev); +register_device_unmigratable (&dev->dev.qdev,"pci-assign" , dev); +return 0 ; assigned_out:
@@ -1503,6 +1512,7 @@ static int assigned_exitfn(struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev); +vmstate_unregister (&dev->dev.qdev, &vmstate_assigned_device, dev);QLIST_REMOVE (dev, next);deassign_device (dev);free_assigned_device (dev);
Quoted 27 lines · Alex Williamson
Use
register_device_unmigratable()to declare ourselves as non-migratable.Signed-off-by Alex Williamson <[email protected]>---
v2: Use dummy vmsd instead of dummy
save_statehw/device-assignment.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)hw/device-assignment.c +4
-0@@ -1434,6 +1434,10 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev) dev->msix_table_page =NULL ; } +static const VMStateDescription vmstate_assigned_device = { + .name ="pci-assign" +}; +static int assigned_initfn (struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev);
hw/device-assignment.c static int assigned_initfn(struct PCIDevice *pci_dev) · line 1499
Quoted 6 lines
hw/device-assignment.c +3
-0@@ -1490,6 +1494,11 @@ static int assigned_initfn(struct PCIDevice *pci_dev)assigned_dev_load_option_rom (dev);QLIST_INSERT_HEAD (&devs, dev, next); + +/* Register a vmsd so that we can mark it unmigratable. */ +vmstate_register (&dev->dev.qdev,0 , &vmstate_assigned_device, dev);
Almost: You can register this vmstate description via assign_info (.qdev.vmsd = ....).
Jan
Quoted 14 lines
hw/device-assignment.c +3
-0+register_device_unmigratable (&dev->dev.qdev,"pci-assign" , dev); +return 0 ; assigned_out:@@ -1503,6 +1512,7 @@ static int assigned_exitfn(struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev); +vmstate_unregister (&dev->dev.qdev, &vmstate_assigned_device, dev);QLIST_REMOVE (dev, next);deassign_device (dev);free_assigned_device (dev);
Quoted 29 lines · Jan Kiszka
Quoted 28 lines · Alex Williamson
Use
register_device_unmigratable()to declare ourselves as non-migratable.Signed-off-by Alex Williamson <[email protected]>---
v2: Use dummy vmsd instead of dummy
save_statehw/device-assignment.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)hw/device-assignment.c +4
-0@@ -1434,6 +1434,10 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev) dev->msix_table_page =NULL ; } +static const VMStateDescription vmstate_assigned_device = { + .name ="pci-assign" +}; +static int assigned_initfn (struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev);@@ -1490,6 +1494,11 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
Quoted 8 lines
hw/device-assignment.c static int assigned_initfn(struct PCIDevice *pci_dev) · line 1499
Quoted 5 lines
hw/device-assignment.c +3
-0assigned_dev_load_option_rom (dev);QLIST_INSERT_HEAD (&devs, dev, next); + +/* Register a vmsd so that we can mark it unmigratable. */ +vmstate_register (&dev->dev.qdev,0 , &vmstate_assigned_device, dev);Almost: You can register this vmstate description via
assign_info(.qdev.vmsd = ....).
Only if you have some other suggestion on where to call register_device_unmigratable rather than init. qdev_init looks like this:
int qdev_init(DeviceState *dev)
{
int rc;
assert(dev->state == DEV_STATE_CREATED);
rc = dev->info->init(dev, dev->info);
if (rc < 0) {
qdev_free(dev);
return rc;
}
qemu_register_reset(qdev_reset, dev);
if (dev->info->vmsd) {
vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev,
dev->instance_id_alias,
dev->alias_required_for_version);
}
dev->state = DEV_STATE_INITIALIZED;
return 0;
}So the save state entry hasn't been inserted yet for me to attach the no_migrate flag to from init :(
Alex
Quoted 63 lines · Alex Williamson
Quoted 29 lines · Jan Kiszka
Quoted 28 lines · Alex Williamson
Use
register_device_unmigratable()to declare ourselves as non-migratable.Signed-off-by Alex Williamson <[email protected]>---
v2: Use dummy vmsd instead of dummy
save_statehw/device-assignment.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)hw/device-assignment.c +4
-0@@ -1434,6 +1434,10 @@ static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev) dev->msix_table_page =NULL ; } +static const VMStateDescription vmstate_assigned_device = { + .name ="pci-assign" +}; +static int assigned_initfn (struct PCIDevice *pci_dev) {AssignedDevice *dev =DO_UPCAST (AssignedDevice, dev, pci_dev);@@ -1490,6 +1494,11 @@ static int assigned_initfn(struct PCIDevice *pci_dev)Quoted 8 lines
hw/device-assignment.c static int assigned_initfn(struct PCIDevice *pci_dev) · line 1499
Quoted 5 lines
hw/device-assignment.c +3
-0assigned_dev_load_option_rom (dev);QLIST_INSERT_HEAD (&devs, dev, next); + +/* Register a vmsd so that we can mark it unmigratable. */ +vmstate_register (&dev->dev.qdev,0 , &vmstate_assigned_device, dev);Almost: You can register this vmstate description via
assign_info(.qdev.vmsd = ....).Only if you have some other suggestion on where to call
register_device_unmigratablerather than init.qdev_initlooks like this:int
qdev_init(DeviceState *dev){ int rc; assert(dev->state == DEV_STATE_CREATED); rc = dev->info->init(dev, dev->info); if (rc < 0) { qdev_free(dev); return rc; } qemu_register_reset(qdev_reset, dev); if (dev->info->vmsd) { vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev, dev->instance_id_alias, dev->alias_required_for_version); } dev->state = DEV_STATE_INITIALIZED; return 0; }
Quoted 2 lines
So the save state entry hasn't been inserted yet for me to attach the
no_migrateflag to from init :(
I see. I think that's a sign register_device_unmigratable should be obsoleted as well by introducing no_migrate to vmstate (one day, vmsd == NULL could replace this flag).
BTW, ivshmem could resolve its need for dynamic no_migrate by introducing two device types: one that is migratable (ivshmem-master) and one that isn't (normal peer devices).
Jan