On 05/13/2015 04:36 AM, Peter Krempa wrote: > On Wed, May 13, 2015 at 11:36:30 +0800, Chen Fan wrote: >> add migration support for ephemeral host devices, introduce >> two 'detach' and 'restore' functions to unplug/plug host devices >> during migration. >> >> Signed-off-by: Chen Fan <chen.fan.fnst@xxxxxxxxxxxxxx> >> --- >> src/qemu/qemu_migration.c | 171 ++++++++++++++++++++++++++++++++++++++++++++-- >> src/qemu/qemu_migration.h | 9 +++ >> src/qemu/qemu_process.c | 11 +++ >> 3 files changed, 187 insertions(+), 4 deletions(-) >> >> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c >> index 56112f9..d5a698f 100644 >> --- a/src/qemu/qemu_migration.c >> +++ b/src/qemu/qemu_migration.c >> @@ -3384,6 +3384,158 @@ qemuMigrationPrepareDef(virQEMUDriverPtr driver, >> return def; >> } >> >> +int >> +qemuMigrationDetachEphemeralDevices(virQEMUDriverPtr driver, >> + virDomainObjPtr vm, >> + bool live) >> +{ >> + qemuDomainObjPrivatePtr priv = vm->privateData; >> + virDomainHostdevDefPtr hostdev; >> + virDomainNetDefPtr net; >> + virDomainDeviceDef dev; >> + virDomainDeviceDefPtr dev_copy = NULL; >> + virCapsPtr caps = NULL; >> + int actualType; >> + int ret = -1; >> + size_t i; >> + >> + VIR_DEBUG("Rum domain detach ephemeral devices"); >> + >> + if (!(caps = virQEMUDriverGetCapabilities(driver, false))) >> + return ret; >> + >> + for (i = 0; i < vm->def->nnets;) { >> + net = vm->def->nets[i]; >> + >> + actualType = virDomainNetGetActualType(net); >> + if (actualType != VIR_DOMAIN_NET_TYPE_HOSTDEV) { >> + i++; >> + continue; >> + } >> + >> + hostdev = virDomainNetGetActualHostdev(net); >> + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || >> + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI || >> + !hostdev->ephemeral) { >> + i++; >> + continue; >> + } >> + >> + dev.type = VIR_DOMAIN_DEVICE_NET; >> + dev.data.net = net; >> + >> + dev_copy = virDomainDeviceDefCopy(&dev, vm->def, >> + caps, driver->xmlopt); >> + if (!dev_copy) >> + goto cleanup; >> + >> + if (live) { >> + /* nnets reduced */ >> + if (qemuDomainDetachNetDevice(driver, vm, dev_copy) < 0) >> + goto cleanup; > > So this is where the fun begins. qemuDomainDetachNetDevice is not > designed to be called this way since the detach API where it's used > normally returns 0 in the following two cases: > > 1) The detach was successfull, the guest removed the device > 2) The detach request was successful, but guest did not remove the > device yet > > In the latter case you need to wait for a event to successfully know > when the device was removed. For historical reference: omission of this bit (needing to wait for the guest to remove the device) was one of the reasons Shradha's patches couldn't be pushed. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list