Re: [libvirt] [PATCHv2 3/4] qemu: Implement share memory device hot-plug
On 12/10/2015 09:23 AM, John Ferlan wrote: $SUBJ s/share/shared thanks for pointing out this On 11/26/2015 04:06 AM, Luyao Huang wrote: Signed-off-by: Luyao Huang--- src/qemu/qemu_driver.c | 10 - src/qemu/qemu_hotplug.c | 58 + src/qemu/qemu_hotplug.h | 3 +++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5ded9ef..3c25c07 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7784,6 +7784,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, dev->data.memory = NULL; break; +case VIR_DOMAIN_DEVICE_SHMEM: +ret = qemuDomainAttachShmemDevice(driver, vm, + dev->data.shmem); +if (!ret) { +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: @@ -7795,7 +7804,6 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_SMARTCARD: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: -case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_LAST: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8804d3d..c5e544d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1882,6 +1882,64 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, } It seems this is modeled after qemuDomainAttachRNGDevice, right? Right :) +int +qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, +virDomainObjPtr vm, +virDomainShmemDefPtr shmem) +{ +int ret = -1; +qemuDomainObjPrivatePtr priv = vm->privateData; +char *devstr = NULL; +char *charAlias = NULL; + +if (virAsprintf(>info.alias, "shmem%zu", vm->def->nshmems) < 0) +return -1; + +if (VIR_REALLOC_N(vm->def->shmems, vm->def->nshmems + 1) < 0) +return -1; + +if ((shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || + shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && + (virDomainPCIAddressEnsureAddr(priv->pciaddrs, >info) < 0)) +return -1; + +if (!(devstr = qemuBuildShmemDevStr(vm->def, shmem, priv->qemuCaps))) +goto cleanup; + +if (virAsprintf(, "char%s", shmem->info.alias) < 0) +goto cleanup; + This seems to be up to a 2 stage process "if" server.enabled" is true" Indeed, i will fix it in next version +qemuDomainObjEnterMonitor(driver, vm); + +if (shmem->server.enabled && +qemuMonitorAttachCharDev(priv->mon, charAlias, + >server.chr) < 0) { Instead of the following change to: goto failchardev; and the {} won't be necessary ... Instead of the following change to goto failadddevice; and the {} won't be necessary ... Again following RNG model - this should have a if (*Exit*() < 0) { vm = NULL; goto cleanup } ... And of course the auditing change as well. ... Following RNG the && vm would be used here... See your patch commits '0ed3b3353' and '980b265d0' ... failadddevice: if (shmem->server.enabled) ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); failchardev: ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto cleanup; Nice improve, i must forgot a old problem that the will be changed after qemu unexpected exit during enter the monitor. Hope this all makes sense (it's been a long day ;-)) Thanks a lot for your review and suggestion, and i am sorry that i didn't reply your mails when i saw them (I'm kind of overwhelmed lately :) ) Have a nice day ! Luyao John +} + + static int qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 4140da3..60137a6 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -109,6 +109,9 @@ int qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainRNGDefPtr rng); +int qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, +virDomainObjPtr vm, +virDomainShmemDefPtr shmem); int qemuDomainChrInsert(virDomainDefPtr vmdef, -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCHv2 3/4] qemu: Implement share memory device hot-plug
[...] > +int > +qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, > +virDomainObjPtr vm, > +virDomainShmemDefPtr shmem) > +{ > +int ret = -1; > +qemuDomainObjPrivatePtr priv = vm->privateData; > +char *devstr = NULL; > +char *charAlias = NULL; Dang... one more thing... why no? if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("qemu does not support -device")); return -1; } I see it's not in AttachRNG (so why it was missed), *BUT* it is in DetachRNG... So it seems a separate patch for AttachRNG should add that? John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCHv2 3/4] qemu: Implement share memory device hot-plug
$SUBJ s/share/shared On 11/26/2015 04:06 AM, Luyao Huang wrote: > Signed-off-by: Luyao Huang> --- > src/qemu/qemu_driver.c | 10 - > src/qemu/qemu_hotplug.c | 58 > + > src/qemu/qemu_hotplug.h | 3 +++ > 3 files changed, 70 insertions(+), 1 deletion(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 5ded9ef..3c25c07 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -7784,6 +7784,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, > dev->data.memory = NULL; > break; > > +case VIR_DOMAIN_DEVICE_SHMEM: > +ret = qemuDomainAttachShmemDevice(driver, vm, > + dev->data.shmem); > +if (!ret) { > +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: > @@ -7795,7 +7804,6 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, > case VIR_DOMAIN_DEVICE_SMARTCARD: > case VIR_DOMAIN_DEVICE_MEMBALLOON: > case VIR_DOMAIN_DEVICE_NVRAM: > -case VIR_DOMAIN_DEVICE_SHMEM: > case VIR_DOMAIN_DEVICE_TPM: > case VIR_DOMAIN_DEVICE_PANIC: > case VIR_DOMAIN_DEVICE_LAST: > diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c > index 8804d3d..c5e544d 100644 > --- a/src/qemu/qemu_hotplug.c > +++ b/src/qemu/qemu_hotplug.c > @@ -1882,6 +1882,64 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, > } > > It seems this is modeled after qemuDomainAttachRNGDevice, right? > +int > +qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, > +virDomainObjPtr vm, > +virDomainShmemDefPtr shmem) > +{ > +int ret = -1; > +qemuDomainObjPrivatePtr priv = vm->privateData; > +char *devstr = NULL; > +char *charAlias = NULL; > + > +if (virAsprintf(>info.alias, "shmem%zu", vm->def->nshmems) < 0) > +return -1; > + > +if (VIR_REALLOC_N(vm->def->shmems, vm->def->nshmems + 1) < 0) > +return -1; > + > +if ((shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || > + shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && > + (virDomainPCIAddressEnsureAddr(priv->pciaddrs, >info) < 0)) > +return -1; > + > +if (!(devstr = qemuBuildShmemDevStr(vm->def, shmem, priv->qemuCaps))) > +goto cleanup; > + > +if (virAsprintf(, "char%s", shmem->info.alias) < 0) > +goto cleanup; > + This seems to be up to a 2 stage process "if" server.enabled" is true"... > +qemuDomainObjEnterMonitor(driver, vm); > + > +if (shmem->server.enabled && > +qemuMonitorAttachCharDev(priv->mon, charAlias, > + >server.chr) < 0) { Instead of the following change to: goto failchardev; and the {} won't be necessary > +ignore_value(qemuDomainObjExitMonitor(driver, vm)); > +goto cleanup; > +} > + > +if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { Instead of the following change to goto failadddevice; and the {} won't be necessary > +if (shmem->server.enabled) > +ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); > +ignore_value(qemuDomainObjExitMonitor(driver, vm)); > +goto cleanup; > +} > +if (qemuDomainObjExitMonitor(driver, vm) < 0) > +goto cleanup; Again following RNG model - this should have a if (*Exit*() < 0) { vm = NULL; goto cleanup } > + > +if (virDomainShmemInsert(vm->def, shmem) < 0) > +goto cleanup; And of course the auditing change as well. > + > +ret = 0; > + cleanup: > +if (ret < 0) Following RNG the && vm would be used here... See your patch commits '0ed3b3353' and '980b265d0' > +qemuDomainReleaseDeviceAddress(vm, >info, NULL); > +VIR_FREE(charAlias); > +VIR_FREE(devstr); > +return ret; failadddevice: if (shmem->server.enabled) ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); failchardev: ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto cleanup; Hope this all makes sense (it's been a long day ;-)) John > +} > + > + > static int > qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver, >virDomainObjPtr vm, > diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h > index 4140da3..60137a6 100644 > --- a/src/qemu/qemu_hotplug.h > +++ b/src/qemu/qemu_hotplug.h > @@ -109,6 +109,9 @@ int qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, > int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, >virDomainObjPtr vm, >virDomainRNGDefPtr rng); > +int qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, > +
[libvirt] [PATCHv2 3/4] qemu: Implement share memory device hot-plug
Signed-off-by: Luyao Huang--- src/qemu/qemu_driver.c | 10 - src/qemu/qemu_hotplug.c | 58 + src/qemu/qemu_hotplug.h | 3 +++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5ded9ef..3c25c07 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7784,6 +7784,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, dev->data.memory = NULL; break; +case VIR_DOMAIN_DEVICE_SHMEM: +ret = qemuDomainAttachShmemDevice(driver, vm, + dev->data.shmem); +if (!ret) { +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: @@ -7795,7 +7804,6 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_SMARTCARD: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: -case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_LAST: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8804d3d..c5e544d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1882,6 +1882,64 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, } +int +qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, +virDomainObjPtr vm, +virDomainShmemDefPtr shmem) +{ +int ret = -1; +qemuDomainObjPrivatePtr priv = vm->privateData; +char *devstr = NULL; +char *charAlias = NULL; + +if (virAsprintf(>info.alias, "shmem%zu", vm->def->nshmems) < 0) +return -1; + +if (VIR_REALLOC_N(vm->def->shmems, vm->def->nshmems + 1) < 0) +return -1; + +if ((shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || + shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && + (virDomainPCIAddressEnsureAddr(priv->pciaddrs, >info) < 0)) +return -1; + +if (!(devstr = qemuBuildShmemDevStr(vm->def, shmem, priv->qemuCaps))) +goto cleanup; + +if (virAsprintf(, "char%s", shmem->info.alias) < 0) +goto cleanup; + +qemuDomainObjEnterMonitor(driver, vm); + +if (shmem->server.enabled && +qemuMonitorAttachCharDev(priv->mon, charAlias, + >server.chr) < 0) { +ignore_value(qemuDomainObjExitMonitor(driver, vm)); +goto cleanup; +} + +if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { +if (shmem->server.enabled) +ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); +ignore_value(qemuDomainObjExitMonitor(driver, vm)); +goto cleanup; +} +if (qemuDomainObjExitMonitor(driver, vm) < 0) +goto cleanup; + +if (virDomainShmemInsert(vm->def, shmem) < 0) +goto cleanup; + +ret = 0; + cleanup: +if (ret < 0) +qemuDomainReleaseDeviceAddress(vm, >info, NULL); +VIR_FREE(charAlias); +VIR_FREE(devstr); +return ret; +} + + static int qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 4140da3..60137a6 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -109,6 +109,9 @@ int qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainRNGDefPtr rng); +int qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, +virDomainObjPtr vm, +virDomainShmemDefPtr shmem); int qemuDomainChrInsert(virDomainDefPtr vmdef, -- 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list