[libvirt] [RFC v1 4/6] migration: Migration support for ephemeral hostdevs

Daniel P. Berrange berrange at redhat.com
Thu May 14 08:51:10 UTC 2015


On Wed, May 13, 2015 at 10:30:32AM -0400, Laine Stump wrote:
> On 05/13/2015 05:57 AM, Daniel P. Berrange wrote:
> > On Wed, May 13, 2015 at 11:36:30AM +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
> > 
> >> +void
> >> +qemuMigrationRestoreEphemeralDevices(virQEMUDriverPtr driver,
> >> +                                     virConnectPtr conn,
> >> +                                     virDomainObjPtr vm,
> >> +                                     bool live)
> >> +{
> >> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> >> +    virDomainDeviceDefPtr dev;
> >> +    int ret = -1;
> >> +    size_t i;
> >> +
> >> +    VIR_DEBUG("Rum domain restore ephemeral devices");
> >> +
> >> +    for (i = 0; i < priv->nEphemeralDevices; i++) {
> >> +        dev = priv->ephemeralDevices[i];
> >> +
> >> +        switch ((virDomainDeviceType) dev->type) {
> >> +        case VIR_DOMAIN_DEVICE_NET:
> >> +            if (live) {
> >> +                ret = qemuDomainAttachNetDevice(conn, driver, vm,
> >> +                                                dev->data.net);
> >> +            } else {
> >> +                ret = virDomainNetInsert(vm->def, dev->data.net);
> >> +            }
> >> +
> >> +            if (!ret)
> >> +                dev->data.net = NULL;
> >> +            break;
> >> +        case VIR_DOMAIN_DEVICE_HOSTDEV:
> >> +            if (live) {
> >> +                ret = qemuDomainAttachHostDevice(conn, driver, vm,
> >> +                                                 dev->data.hostdev);
> >> +           } else {
> >> +                ret =virDomainHostdevInsert(vm->def, dev->data.hostdev);
> >> +            }
> > 
> > This re-attach step is where we actually have far far far worse problems
> > than with detach. This is blindly assuming that the guest on the target
> > host can use the same hostdev that it was using on the source host.
> 
> (kind of pointless to comment on, since pkrempa has changed my opinion
> by forcing me to think about the "failure to reattach" condition, but
> could be useful info for others)
> 
> For a <hostdev>, yes, but not for <interface type='network'> (which
> would point to a libvirt network pool of VFs).

I should note that in OpenStack at least we don't ever use the
libvirt <interface type='network'> feature. This is because the
OpenStack scheduler needs to have better control over exactly
which VFs are allocated to which guest. This code runs on a
separate host, and takes into account stuff such as the NUMA
affinity of the guest, the utilization of the VFs by other
guests, and more besides. So even in the <interface> case
this proposal is pretty limited in usefulness.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list