[libvirt] [RFC v1 4/6] migration: Migration support for ephemeral hostdevs
Laine Stump
laine at redhat.com
Wed May 13 14:13:19 UTC 2015
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 at cn.fujitsu.com>
>> ---
>> 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.
More information about the libvir-list
mailing list