On Fri, Oct 14, 2016 at 10:25:26AM -0400, John Ferlan wrote:
[...]
>>> +int
>>> +qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
>>> + virDomainObjPtr vm,
>>> + virDomainDeviceDefPtr 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->data.shmem) <
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();
>>> +
>>> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
>>> + ret = -1;
>>> +
>>> + if (ret == 0) {
>>> + if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1) {
>>> + qemuDomainReleaseDeviceAddress(vm, &shmem->info, NULL);
>>> + ret = qemuDomainRemoveDevice(driver, vm, dev);
>>
>> Why not a direct qemuDomainRemoveShmemDevice(driver, vm, shmem);
>>
>> It's the pattern other code uses - just concern over the difference - it
>> does result in the same call eventually.
>>
>
> What other code? It doesn't necessarily result in the same call every
> time. That's what qemuDomainWaitForDeviceRemoval() is for. We
> shouldn't remove it from the definition if QEMU didn't actually remove
> it.
>
Most callers to qemuDomainWaitForDeviceRemoval except
qemuDomainDetachChrDevice which throws in release device address, but
still calls its RemoveChrDevice directly rather than the generic
RemoveDevice call.
Oh, I misunderstood that, you meant qemuDomainRemoveShmemDevice() instead
of qemuDomainRemoveDevice(). Yes, I can do that, I left the Device
there because I was using the actual device for something in one of the
versions before posting it and then haven't changed it back.
John