Skip to contentSkip to conversation

device-assignment: Register as un-migratable

PATCH Superseded Alex Williamson 2 participants 4 messages Nov 15, 2010 KVM

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

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
index bde231d..154bb1a 100644
@@ -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);
#1 lore raw
Quoted 27 lines · Alex Williamson

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 +4 -0
index bde231d..154bb1a 100644
@@ -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);
#2 lore raw
Quoted 29 lines · Jan Kiszka
Quoted 28 lines · Alex Williamson

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 +4 -0
index bde231d..154bb1a 100644
@@ -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 -0
     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 = ....).

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

#3 lore raw
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.

---

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 +4 -0
index bde231d..154bb1a 100644
@@ -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 -0
     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 = ....).

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;
}
Quoted 2 lines

So the save state entry hasn't been inserted yet for me to attach the no_migrate flag 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