Commit a1190ab6 authored by Jens Freimann's avatar Jens Freimann Committed by Michael S. Tsirkin
Browse files

migration: allow unplug during migration for failover devices



In "b06424de migration: Disable hotplug/unplug during migration" we
added a check to disable unplug for all devices until we have figured
out what works. For failover primary devices qdev_unplug() is called
from the migration handler, i.e. during migration.

This patch adds a flag to DeviceState which is set to false for all
devices and makes an exception for PCI devices that are also
primary devices in a failover pair.

Signed-off-by: default avatarJens Freimann <jfreimann@redhat.com>
Message-Id: <20191029114905.6856-8-jfreimann@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 70d04971
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -996,6 +996,7 @@ static void device_initfn(Object *obj)

    dev->instance_id_alias = -1;
    dev->realized = false;
    dev->allow_unplug_during_migration = false;

    object_property_add_bool(obj, "realized",
                             device_get_realized, device_set_realized, NULL);
+1 −0
Original line number Diff line number Diff line
@@ -2130,6 +2130,7 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
            pci_qdev_unrealize(DEVICE(pci_dev), NULL);
            return;
        }
        qdev->allow_unplug_during_migration = true;
    }

    /* rom loading */
+1 −0
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ struct DeviceState {
    bool pending_deleted_event;
    QemuOpts *opts;
    int hotplugged;
    bool allow_unplug_during_migration;
    BusState *parent_bus;
    QLIST_HEAD(, NamedGPIOList) gpios;
    QLIST_HEAD(, BusState) child_bus;
+1 −1
Original line number Diff line number Diff line
@@ -851,7 +851,7 @@ void qdev_unplug(DeviceState *dev, Error **errp)
        return;
    }

    if (!migration_is_idle()) {
    if (!migration_is_idle() && !dev->allow_unplug_during_migration) {
        error_setg(errp, "device_del not allowed while migrating");
        return;
    }