On Wed, Oct 26, 2016 at 12:51:37 +0200, Martin Kletzander wrote: > This is needed in order to migrate a domain with shmem devices as that > is not allowed to migrate. > > Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> > --- > src/qemu/qemu_driver.c | 39 +++- > src/qemu/qemu_hotplug.c | 248 ++++++++++++++++++++- > src/qemu/qemu_hotplug.h | 6 + > tests/qemuhotplugtest.c | 21 ++ > .../qemuhotplug-ivshmem-doorbell-detach.xml | 7 + > .../qemuhotplug-ivshmem-doorbell.xml | 4 + > .../qemuhotplug-ivshmem-plain-detach.xml | 6 + > .../qemuhotplug-ivshmem-plain.xml | 3 + > ...muhotplug-base-live+ivshmem-doorbell-detach.xml | 1 + > .../qemuhotplug-base-live+ivshmem-doorbell.xml | 65 ++++++ > .../qemuhotplug-base-live+ivshmem-plain-detach.xml | 1 + > .../qemuhotplug-base-live+ivshmem-plain.xml | 58 +++++ > 12 files changed, 454 insertions(+), 5 deletions(-) > create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-ivshmem-doorbell-detach.xml > create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-ivshmem-doorbell.xml > create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-ivshmem-plain-detach.xml > create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-ivshmem-plain.xml > create mode 120000 tests/qemuhotplugtestdomains/qemuhotplug-base-live+ivshmem-doorbell-detach.xml > create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-base-live+ivshmem-doorbell.xml > create mode 120000 tests/qemuhotplugtestdomains/qemuhotplug-base-live+ivshmem-plain-detach.xml > create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-base-live+ivshmem-plain.xml > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index bacabd2d348f..c164c390eccf 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -7601,6 +7601,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, > dev->data.memory = NULL; > break; > > + case VIR_DOMAIN_DEVICE_SHMEM: > + ret = qemuDomainAttachShmemDevice(driver, vm, > + dev->data.shmem); > + if (!ret) { Change the condition to something more orthodox, like "< 0". > + alias = dev->data.shmem->info.alias; > + dev->data.shmem = NULL; > + } > + break; > + > case VIR_DOMAIN_DEVICE_NONE: > case VIR_DOMAIN_DEVICE_FS: > case VIR_DOMAIN_DEVICE_INPUT: [...] > diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c > index 7a21dc67f533..10236a0bccd9 100644 > --- a/src/qemu/qemu_hotplug.c > +++ b/src/qemu/qemu_hotplug.c [...] > @@ -4271,6 +4455,68 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver, > return qemuDomainDetachThisHostDevice(driver, vm, detach); > } > > + > +int > +qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, > + virDomainObjPtr vm, > + virDomainShmemDefPtr dev) > +{ > + int ret = -1; > + ssize_t idx = -1; > + virErrorPtr orig_err = NULL; > + virDomainShmemDefPtr shmem = NULL; > + qemuDomainObjPrivatePtr priv = vm->privateData; > + > + if ((idx = virDomainShmemDefFind(vm->def, dev)) < 0) { > + virReportError(VIR_ERR_OPERATION_INVALID, "%s", > + _("device not present in domain configuration")); > + return -1; > + } > + > + shmem = vm->def->shmems[idx]; > + > + switch ((virDomainShmemModel)shmem->model) { > + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_PLAIN: > + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL: > + break; > + > + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM: > + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, > + _("live detach of shmem model '%s' is not supported"), > + virDomainShmemModelTypeToString(shmem->model)); > + /* fall-through */ > + case VIR_DOMAIN_SHMEM_MODEL_LAST: > + return -1; > + } > + > + qemuDomainMarkDeviceForRemoval(vm, &shmem->info); > + qemuDomainObjEnterMonitor(driver, vm); > + > + ret = qemuMonitorDelDevice(priv->mon, shmem->info.alias); > + > + if (ret < 0) > + orig_err = virSaveLastError(); Is this necessary? The only place where it would be overwritten is ... > + > + if (qemuDomainObjExitMonitor(driver, vm) < 0) ... here and only if qemu crashes at this point. > + ret = -1; > + > + if (ret == 0) { > + if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1) { > + qemuDomainReleaseDeviceAddress(vm, &shmem->info, NULL); > + ret = qemuDomainRemoveShmemDevice(driver, vm, shmem); > + } > + } > + qemuDomainResetDeviceRemoval(vm); > + > + if (orig_err) { > + virSetError(orig_err); > + virFreeError(orig_err); > + } ACK
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list