[libvirt] [PATCH 00/13] qemu: Refactor how we handle 'object's on the monitor

This applies on top of the tls/secret alias refactoring series I've posted earlier today: https://www.redhat.com/archives/libvir-list/2018-May/msg02174.html The main idea is to clarify the lifecycle of the objects used on the monitor and clean up the code using it. Peter Krempa (13): qemu: command: Fix name of qemuBuildMemoryBackendStr qemu: monitor: Rename qemuMonitorAddObject to qemuMonitorAddObjectType qemu: Rename virQEMUBuildObjectCommandlineFromJSON qemu: monitor: Add better APIs for adding of objects to qemu util: qemu: Introduce helper for formatting command line from new object props qemu: hotplug: Refactor PR props formatting to use qemuMonitorCreateObjectProps qemu: hotplug: Refactor RNG props formatting to use qemuMonitorCreateObjectProps qemu: hotplug: Refactor memory props formatting to qemuMonitorCreateObjectProps qemu: hotplug: Refactor shmem props formatting to qemuMonitorCreateObjectProps qemu: hotplug: Refactor tls-credential props formatting to qemuMonitorCreateObjectProps qemu: hotplug: Refactor 'secret' props formatting to qemuMonitorCreateObjectProps qemu: Convert iothread hotplug to qemuMonitorCreateObjectProps qemu: Delete old unused code for adding objects to qemu src/qemu/qemu_command.c | 300 +++++++++++++++++---------------------- src/qemu/qemu_command.h | 18 +-- src/qemu/qemu_driver.c | 14 +- src/qemu/qemu_hotplug.c | 148 +++++++------------ src/qemu/qemu_hotplug.h | 3 +- src/qemu/qemu_migration_params.c | 5 +- src/qemu/qemu_monitor.c | 98 +++++++++++-- src/qemu/qemu_monitor.h | 14 +- src/qemu/qemu_monitor_json.c | 15 +- src/qemu/qemu_monitor_json.h | 2 - src/util/virqemu.c | 40 ++++-- src/util/virqemu.h | 5 +- 12 files changed, 336 insertions(+), 326 deletions(-) -- 2.16.2

The function generates JSON properties rather than a string so rename it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 26 +++++++++++++------------- src/qemu/qemu_command.h | 16 ++++++++-------- src/qemu/qemu_hotplug.c | 4 ++-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 07fa35c6b3..39dcd1cfba 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2941,7 +2941,7 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd, /** - * qemuBuildMemoryBackendStr: + * qemuBuildMemoryBackendProps: * @backendProps: [out] constructed object * @backendType: [out] type of the backennd used * @cfg: qemu driver config object @@ -2967,14 +2967,14 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd, * -1 on error. */ int -qemuBuildMemoryBackendStr(virJSONValuePtr *backendProps, - const char **backendType, - virQEMUDriverConfigPtr cfg, - virQEMUCapsPtr qemuCaps, - virDomainDefPtr def, - virDomainMemoryDefPtr mem, - virBitmapPtr autoNodeset, - bool force) +qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, + const char **backendType, + virQEMUDriverConfigPtr cfg, + virQEMUCapsPtr qemuCaps, + virDomainDefPtr def, + virDomainMemoryDefPtr mem, + virBitmapPtr autoNodeset, + bool force) { virDomainNumatuneMemMode mode; const long system_page_size = virGetSystemPageSizeKB(); @@ -3225,8 +3225,8 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, mem.targetNode = cell; mem.info.alias = alias; - if ((rc = qemuBuildMemoryBackendStr(&props, &backendType, cfg, priv->qemuCaps, - def, &mem, priv->autoNodeset, false)) < 0) + if ((rc = qemuBuildMemoryBackendProps(&props, &backendType, cfg, priv->qemuCaps, + def, &mem, priv->autoNodeset, false)) < 0) goto cleanup; if (!(*backendStr = virQEMUBuildObjectCommandlineFromJSON(backendType, @@ -3264,8 +3264,8 @@ qemuBuildMemoryDimmBackendStr(virDomainMemoryDefPtr mem, if (virAsprintf(&alias, "mem%s", mem->info.alias) < 0) goto cleanup; - if (qemuBuildMemoryBackendStr(&props, &backendType, cfg, priv->qemuCaps, - def, mem, priv->autoNodeset, true) < 0) + if (qemuBuildMemoryBackendProps(&props, &backendType, cfg, priv->qemuCaps, + def, mem, priv->autoNodeset, true) < 0) goto cleanup; ret = virQEMUBuildObjectCommandlineFromJSON(backendType, alias, props); diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index bbbf152660..2b2168d1ee 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -119,14 +119,14 @@ int qemuBuildControllerDevStr(const virDomainDef *domainDef, char **devstr, int *nusbcontroller); -int qemuBuildMemoryBackendStr(virJSONValuePtr *backendProps, - const char **backendType, - virQEMUDriverConfigPtr cfg, - virQEMUCapsPtr qemuCaps, - virDomainDefPtr def, - virDomainMemoryDefPtr mem, - virBitmapPtr autoNodeset, - bool force); +int qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, + const char **backendType, + virQEMUDriverConfigPtr cfg, + virQEMUCapsPtr qemuCaps, + virDomainDefPtr def, + virDomainMemoryDefPtr mem, + virBitmapPtr autoNodeset, + bool force); char *qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4f58cfbd9a..7ce427be0d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2142,8 +2142,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (!(devstr = qemuBuildMemoryDeviceStr(mem))) goto cleanup; - if (qemuBuildMemoryBackendStr(&props, &backendType, cfg, - priv->qemuCaps, vm->def, mem, NULL, true) < 0) + if (qemuBuildMemoryBackendProps(&props, &backendType, cfg, + priv->qemuCaps, vm->def, mem, NULL, true) < 0) goto cleanup; if (qemuProcessBuildDestroyMemoryPaths(driver, vm, mem, true) < 0) -- 2.16.2

On Wed, May 30, 2018 at 07:06:25PM +0200, Peter Krempa wrote:
The function generates JSON properties rather than a string so rename it.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 26 +++++++++++++------------- src/qemu/qemu_command.h | 16 ++++++++-------- src/qemu/qemu_hotplug.c | 4 ++-- 3 files changed, 23 insertions(+), 23 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

The function adds the object of a certain type. Change the name so that we make room for the generic function. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_hotplug.c | 50 ++++++++++++++++++++++++------------------------- src/qemu/qemu_monitor.c | 10 +++++----- src/qemu/qemu_monitor.h | 8 ++++---- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3aa694de12..922603a7a3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5819,7 +5819,7 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); - rc = qemuMonitorAddObject(priv->mon, "iothread", alias, NULL); + rc = qemuMonitorAddObjectType(priv->mon, "iothread", alias, NULL); exp_niothreads++; if (rc < 0) goto exit_monitor; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 7ce427be0d..10735622d1 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -487,28 +487,28 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); if (secobjProps) { - rv = qemuMonitorAddObject(priv->mon, "secret", secinfo->s.aes.alias, - secobjProps); - secobjProps = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, "secret", secinfo->s.aes.alias, + secobjProps); + secobjProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; secobjAdded = true; } if (encobjProps) { - rv = qemuMonitorAddObject(priv->mon, "secret", encinfo->s.aes.alias, - encobjProps); - encobjProps = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, "secret", encinfo->s.aes.alias, + encobjProps); + encobjProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; encobjAdded = true; } if (prmgrProps) { - rv = qemuMonitorAddObject(priv->mon, "pr-manager-helper", - disk->src->pr->mgralias, - prmgrProps); - prmgrProps = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, "pr-manager-helper", + disk->src->pr->mgralias, + prmgrProps); + prmgrProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; prmgrAdded = true; @@ -1465,17 +1465,17 @@ qemuDomainAddTLSObjects(virQEMUDriverPtr driver, return -1; if (secAlias) { - rc = qemuMonitorAddObject(priv->mon, "secret", - secAlias, *secProps); - *secProps = NULL; /* qemuMonitorAddObject consumes */ + rc = qemuMonitorAddObjectType(priv->mon, "secret", + secAlias, *secProps); + *secProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rc < 0) goto error; } if (tlsAlias) { - rc = qemuMonitorAddObject(priv->mon, "tls-creds-x509", - tlsAlias, *tlsProps); - *tlsProps = NULL; /* qemuMonitorAddObject consumes */ + rc = qemuMonitorAddObjectType(priv->mon, "tls-creds-x509", + tlsAlias, *tlsProps); + *tlsProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rc < 0) goto error; } @@ -2037,8 +2037,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, goto exit_monitor; chardevAdded = true; - rv = qemuMonitorAddObject(priv->mon, type, objAlias, props); - props = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, type, objAlias, props); + props = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; objAdded = true; @@ -2168,8 +2168,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, goto removedef; qemuDomainObjEnterMonitor(driver, vm); - rv = qemuMonitorAddObject(priv->mon, backendType, objalias, props); - props = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, backendType, objalias, props); + props = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; objAdded = true; @@ -2407,9 +2407,9 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); if (secobjProps) { - rv = qemuMonitorAddObject(priv->mon, "secret", secinfo->s.aes.alias, - secobjProps); - secobjProps = NULL; /* qemuMonitorAddObject consumes */ + rv = qemuMonitorAddObjectType(priv->mon, "secret", secinfo->s.aes.alias, + secobjProps); + secobjProps = NULL; /* qemuMonitorAddObjectType consumes */ if (rv < 0) goto exit_monitor; secobjAdded = true; @@ -2780,8 +2780,8 @@ qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, &shmem->server.chr) < 0) goto exit_monitor; } else { - if (qemuMonitorAddObject(priv->mon, "memory-backend-file", - memAlias, props) < 0) { + if (qemuMonitorAddObjectType(priv->mon, "memory-backend-file", + memAlias, props) < 0) { props = NULL; goto exit_monitor; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 43f1d2f816..77ad47cb74 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2992,7 +2992,7 @@ qemuMonitorAddDeviceArgs(qemuMonitorPtr mon, /** - * qemuMonitorAddObject: + * qemuMonitorAddObjectType: * @mon: Pointer to monitor object * @type: Type name of object to add * @objalias: Alias of the new object @@ -3002,10 +3002,10 @@ qemuMonitorAddDeviceArgs(qemuMonitorPtr mon, * Returns 0 on success -1 on error. */ int -qemuMonitorAddObject(qemuMonitorPtr mon, - const char *type, - const char *objalias, - virJSONValuePtr props) +qemuMonitorAddObjectType(qemuMonitorPtr mon, + const char *type, + const char *objalias, + virJSONValuePtr props) { VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c28db1a52b..77a26d4a8a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -797,10 +797,10 @@ int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon, int qemuMonitorDelDevice(qemuMonitorPtr mon, const char *devalias); -int qemuMonitorAddObject(qemuMonitorPtr mon, - const char *type, - const char *objalias, - virJSONValuePtr props); +int qemuMonitorAddObjectType(qemuMonitorPtr mon, + const char *type, + const char *objalias, + virJSONValuePtr props); int qemuMonitorDelObject(qemuMonitorPtr mon, const char *objalias); -- 2.16.2

On Wed, May 30, 2018 at 07:06:26PM +0200, Peter Krempa wrote:
The function adds the object of a certain type. Change the name so that we make room for the generic function.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_hotplug.c | 50 ++++++++++++++++++++++++------------------------- src/qemu/qemu_monitor.c | 10 +++++----- src/qemu/qemu_monitor.h | 8 ++++---- 4 files changed, 35 insertions(+), 35 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

s/virQEMUBuildObjectCommandlineFromJSON/virQEMUBuildObjectCommandlineFromJSONType/ The function adds the object of a certain type. Change the name so that we make room for the generic function. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 2 +- src/qemu/qemu_command.c | 32 ++++++++++++++++---------------- src/util/virqemu.c | 6 +++--- src/util/virqemu.h | 6 +++--- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6001635916..e2a9916326 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2599,7 +2599,7 @@ virQEMUBuildCommandLineJSON; virQEMUBuildCommandLineJSONArrayBitmap; virQEMUBuildCommandLineJSONArrayNumbered; virQEMUBuildDriveCommandlineFromJSON; -virQEMUBuildObjectCommandlineFromJSON; +virQEMUBuildObjectCommandlineFromJSONType; virQEMUBuildQemuImgKeySecretOpts; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 39dcd1cfba..5b0e21a425 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -550,9 +550,9 @@ qemuBuildObjectSecretCommandLine(virCommandPtr cmd, if (qemuBuildSecretInfoProps(secinfo, &props) < 0) return -1; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSON("secret", - secinfo->s.aes.alias, - props))) + if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("secret", + secinfo->s.aes.alias, + props))) goto cleanup; virCommandAddArgList(cmd, "-object", tmp, NULL); @@ -750,8 +750,8 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, qemuCaps, &props) < 0) goto cleanup; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSON("tls-creds-x509", - alias, props))) + if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("tls-creds-x509", + alias, props))) goto cleanup; virCommandAddArgList(cmd, "-object", tmp, NULL); @@ -3229,9 +3229,9 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, def, &mem, priv->autoNodeset, false)) < 0) goto cleanup; - if (!(*backendStr = virQEMUBuildObjectCommandlineFromJSON(backendType, - alias, - props))) + if (!(*backendStr = virQEMUBuildObjectCommandlineFromJSONType(backendType, + alias, + props))) goto cleanup; ret = rc; @@ -3268,7 +3268,7 @@ qemuBuildMemoryDimmBackendStr(virDomainMemoryDefPtr mem, def, mem, priv->autoNodeset, true) < 0) goto cleanup; - ret = virQEMUBuildObjectCommandlineFromJSON(backendType, alias, props); + ret = virQEMUBuildObjectCommandlineFromJSONType(backendType, alias, props); cleanup: VIR_FREE(alias); @@ -5565,7 +5565,7 @@ qemuBuildRNGBackendStr(virDomainRNGDefPtr rng, if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0) goto cleanup; - ret = virQEMUBuildObjectCommandlineFromJSON(type, alias, props); + ret = virQEMUBuildObjectCommandlineFromJSONType(type, alias, props); cleanup: VIR_FREE(alias); @@ -8831,9 +8831,9 @@ qemuBuildShmemBackendMemStr(virDomainShmemDefPtr shmem) if (virAsprintf(&alias, "shmmem-%s", shmem->info.alias) < 0) goto cleanup; - ret = virQEMUBuildObjectCommandlineFromJSON("memory-backend-file", - alias, - props); + ret = virQEMUBuildObjectCommandlineFromJSONType("memory-backend-file", + alias, + props); cleanup: VIR_FREE(alias); virJSONValueFree(props); @@ -9771,9 +9771,9 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd, if (qemuBuildPRManagerInfoProps(disk, &props) < 0) goto cleanup; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSON("pr-manager-helper", - disk->src->pr->mgralias, - props))) + if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("pr-manager-helper", + disk->src->pr->mgralias, + props))) goto cleanup; virJSONValueFree(props); props = NULL; diff --git a/src/util/virqemu.c b/src/util/virqemu.c index 04cd71605e..fc4727e126 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -242,9 +242,9 @@ virQEMUBuildCommandLineJSON(virJSONValuePtr value, char * -virQEMUBuildObjectCommandlineFromJSON(const char *type, - const char *alias, - virJSONValuePtr props) +virQEMUBuildObjectCommandlineFromJSONType(const char *type, + const char *alias, + virJSONValuePtr props) { virBuffer buf = VIR_BUFFER_INITIALIZER; char *ret = NULL; diff --git a/src/util/virqemu.h b/src/util/virqemu.h index 2599481753..0ef8e8d31d 100644 --- a/src/util/virqemu.h +++ b/src/util/virqemu.h @@ -43,9 +43,9 @@ int virQEMUBuildCommandLineJSON(virJSONValuePtr value, virBufferPtr buf, virQEMUBuildCommandLineJSONArrayFormatFunc array); -char *virQEMUBuildObjectCommandlineFromJSON(const char *type, - const char *alias, - virJSONValuePtr props); +char *virQEMUBuildObjectCommandlineFromJSONType(const char *type, + const char *alias, + virJSONValuePtr props); char *virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr src); -- 2.16.2

On Wed, May 30, 2018 at 07:06:27PM +0200, Peter Krempa wrote:
s/virQEMUBuildObjectCommandlineFromJSON/virQEMUBuildObjectCommandlineFromJSONType/
The function adds the object of a certain type. Change the name so that we make room for the generic function.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 2 +- src/qemu/qemu_command.c | 32 ++++++++++++++++---------------- src/util/virqemu.c | 6 +++--- src/util/virqemu.h | 6 +++--- 4 files changed, 23 insertions(+), 23 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use the new monitor command internal API to allow wrapping of the object name and alias into the JSON props so that they don't have to be passed out of band. The new API also takes a double pointer so that it can be cleared when the value is consumed so that it does not need to happen in every single caller. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 116 +++++++++++++++++++++++++++++++++++++++++-- src/qemu/qemu_monitor.h | 13 +++++ src/qemu/qemu_monitor_json.c | 15 ++---- src/qemu/qemu_monitor_json.h | 2 - 4 files changed, 129 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 77ad47cb74..fe8fdfaf9a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2991,6 +2991,109 @@ qemuMonitorAddDeviceArgs(qemuMonitorPtr mon, } +virJSONValuePtr +qemuMonitorCreateObjectPropsWrap(const char *type, + const char *alias, + virJSONValuePtr *props) +{ + virJSONValuePtr ret; + + ignore_value(virJSONValueObjectCreate(&ret, + "s:qom-type", type, + "s:id", alias, + "A:props", props, + NULL)); + return ret; +} + + + +/** + * qemuMonitorCreateObjectProps: + * @propsret: returns full object properties + * @type: Type name of object to add + * @objalias: Alias of the new object + * @...: Optional arguments for the given object. See virJSONValueObjectAddVArgs. + * + * Returns a JSONValue containing everything on success and NULL on error. + */ +int +qemuMonitorCreateObjectProps(virJSONValuePtr *propsret, + const char *type, + const char *alias, + ...) +{ + virJSONValuePtr props = NULL; + int ret = -1; + va_list args; + + *propsret = NULL; + + va_start(args, alias); + + if (!(virJSONValueObjectCreateVArgs(&props, args))) + goto cleanup; + + if (!(*propsret = qemuMonitorCreateObjectPropsWrap(type, alias, &props))) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(props); + va_end(args); + return ret; +} + + +/** + * qemuMonitorAddObject: + * @mon: Pointer to monitor object + * @props: Optional arguments for the given type. The object is consumed and + * the pointer is cleared. + * @alias: If not NULL, returns the alias of the added object if it was added + * successfully to qemu. Caller should free the returned pointer. + * + * Returns 0 on success -1 on error. + */ +int +qemuMonitorAddObject(qemuMonitorPtr mon, + virJSONValuePtr *props, + char **alias) +{ + const char *type = virJSONValueObjectGetString(*props, "qom-type"); + const char *id = virJSONValueObjectGetString(*props, "id"); + char *tmp = NULL; + int ret = -1; + + VIR_DEBUG("type=%s id=%s", NULLSTR(type), NULLSTR(id)); + + QEMU_CHECK_MONITOR_GOTO(mon, cleanup); + + if (!id) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing alias for qemu object '%s'"), NULLSTR(type)); + goto cleanup; + } + + if (alias && VIR_STRDUP(tmp, id) < 0) + goto cleanup; + + ret = qemuMonitorJSONAddObject(mon, *props); + *props = NULL; + + if (alias) + VIR_STEAL_PTR(*alias, tmp); + + cleanup: + VIR_FREE(tmp); + virJSONValueFree(*props); + *props = NULL; + return ret; +} + + + /** * qemuMonitorAddObjectType: * @mon: Pointer to monitor object @@ -3007,15 +3110,20 @@ qemuMonitorAddObjectType(qemuMonitorPtr mon, const char *objalias, virJSONValuePtr props) { + virJSONValuePtr tmpprops = NULL; + int ret = -1; + VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props); - QEMU_CHECK_MONITOR_GOTO(mon, error); + if (!(tmpprops = qemuMonitorCreateObjectPropsWrap(type, objalias, &props))) + goto cleanup; - return qemuMonitorJSONAddObject(mon, type, objalias, props); + ret = qemuMonitorAddObject(mon, &tmpprops, NULL); - error: + cleanup: virJSONValueFree(props); - return -1; + virJSONValueFree(tmpprops); + return ret; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 77a26d4a8a..0c13391520 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -797,6 +797,19 @@ int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon, int qemuMonitorDelDevice(qemuMonitorPtr mon, const char *devalias); +virJSONValuePtr qemuMonitorCreateObjectPropsWrap(const char *type, + const char *alias, + virJSONValuePtr *props); + +int qemuMonitorCreateObjectProps(virJSONValuePtr *propsret, + const char *type, + const char *alias, + ...); + +int qemuMonitorAddObject(qemuMonitorPtr mon, + virJSONValuePtr *props, + char **alias); + int qemuMonitorAddObjectType(qemuMonitorPtr mon, const char *type, const char *objalias, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 9f5c358795..7522eaeef0 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4003,21 +4003,15 @@ qemuMonitorJSONAddDevice(qemuMonitorPtr mon, } -int qemuMonitorJSONAddObject(qemuMonitorPtr mon, - const char *type, - const char *objalias, - virJSONValuePtr props) +int +qemuMonitorJSONAddObject(qemuMonitorPtr mon, + virJSONValuePtr props) { int ret = -1; virJSONValuePtr cmd; virJSONValuePtr reply = NULL; - cmd = qemuMonitorJSONMakeCommand("object-add", - "s:qom-type", type, - "s:id", objalias, - "A:props", &props, - NULL); - if (!cmd) + if (!(cmd = qemuMonitorJSONMakeCommandInternal("object-add", props, false))) goto cleanup; if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) @@ -4030,7 +4024,6 @@ int qemuMonitorJSONAddObject(qemuMonitorPtr mon, cleanup: virJSONValueFree(cmd); virJSONValueFree(reply); - virJSONValueFree(props); return ret; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index f4ac8319ac..5fc51b1d6b 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -230,8 +230,6 @@ int qemuMonitorJSONDelDevice(qemuMonitorPtr mon, const char *devalias); int qemuMonitorJSONAddObject(qemuMonitorPtr mon, - const char *type, - const char *objalias, virJSONValuePtr props); int qemuMonitorJSONDelObject(qemuMonitorPtr mon, -- 2.16.2

On Wed, May 30, 2018 at 07:06:28PM +0200, Peter Krempa wrote:
Use the new monitor command internal API to allow wrapping of the object name and alias into the JSON props so that they don't have to be passed out of band.
The new API also takes a double pointer so that it can be cleared when the value is consumed so that it does not need to happen in every single caller.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 116 +++++++++++++++++++++++++++++++++++++++++-- src/qemu/qemu_monitor.h | 13 +++++ src/qemu/qemu_monitor_json.c | 15 ++---- src/qemu/qemu_monitor_json.h | 2 - 4 files changed, 129 insertions(+), 17 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 + src/util/virqemu.c | 40 ++++++++++++++++++++++++++++++++++++---- src/util/virqemu.h | 3 +++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e2a9916326..37922f8c84 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2599,6 +2599,7 @@ virQEMUBuildCommandLineJSON; virQEMUBuildCommandLineJSONArrayBitmap; virQEMUBuildCommandLineJSONArrayNumbered; virQEMUBuildDriveCommandlineFromJSON; +virQEMUBuildObjectCommandlineFromJSON; virQEMUBuildObjectCommandlineFromJSONType; virQEMUBuildQemuImgKeySecretOpts; diff --git a/src/util/virqemu.c b/src/util/virqemu.c index fc4727e126..1390b68b86 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -241,6 +241,29 @@ virQEMUBuildCommandLineJSON(virJSONValuePtr value, } +static int +virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf, + const char *type, + const char *alias, + virJSONValuePtr props) +{ + if (!type || !alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing 'type' or 'alias' field of QOM 'object'")); + return -1; + } + + virBufferAsprintf(buf, "%s,id=%s,", type, alias); + + if (props && + virQEMUBuildCommandLineJSON(props, buf, + virQEMUBuildCommandLineJSONArrayBitmap) < 0) + return -1; + + return 0; +} + + char * virQEMUBuildObjectCommandlineFromJSONType(const char *type, const char *alias, @@ -249,10 +272,7 @@ virQEMUBuildObjectCommandlineFromJSONType(const char *type, virBuffer buf = VIR_BUFFER_INITIALIZER; char *ret = NULL; - virBufferAsprintf(&buf, "%s,id=%s,", type, alias); - - if (virQEMUBuildCommandLineJSON(props, &buf, - virQEMUBuildCommandLineJSONArrayBitmap) < 0) + if (virQEMUBuildObjectCommandlineFromJSONInternal(&buf, type, alias, props) < 0) goto cleanup; if (virBufferCheckError(&buf) < 0) @@ -266,6 +286,18 @@ virQEMUBuildObjectCommandlineFromJSONType(const char *type, } +int +virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, + virJSONValuePtr objprops) +{ + const char *type = virJSONValueObjectGetString(objprops, "qom-type"); + const char *alias = virJSONValueObjectGetString(objprops, "id"); + virJSONValuePtr props = virJSONValueObjectGetObject(objprops, "props"); + + return virQEMUBuildObjectCommandlineFromJSONInternal(buf, type, alias, props); +} + + char * virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr srcdef) { diff --git a/src/util/virqemu.h b/src/util/virqemu.h index 0ef8e8d31d..0a4f4468f2 100644 --- a/src/util/virqemu.h +++ b/src/util/virqemu.h @@ -47,6 +47,9 @@ char *virQEMUBuildObjectCommandlineFromJSONType(const char *type, const char *alias, virJSONValuePtr props); +int virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, + virJSONValuePtr objprops); + char *virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr src); void virQEMUBuildBufferEscapeComma(virBufferPtr buf, const char *str); -- 2.16.2

On Wed, May 30, 2018 at 07:06:29PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 + src/util/virqemu.c | 40 ++++++++++++++++++++++++++++++++++++---- src/util/virqemu.h | 3 +++ 3 files changed, 40 insertions(+), 4 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 30 ++++++++++-------------------- src/qemu/qemu_hotplug.c | 19 +++++++------------ 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5b0e21a425..00fb1a3b32 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9730,18 +9730,11 @@ int qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk, virJSONValuePtr *propsret) { - int ret = -1; - - *propsret = NULL; - - if (virJSONValueObjectCreate(propsret, - "s:path", disk->src->pr->path, - NULL) < 0) - goto cleanup; - - ret = 0; - cleanup: - return ret; + return qemuMonitorCreateObjectProps(propsret, + "pr-manager-helper", + disk->src->pr->mgralias, + "s:path", disk->src->pr->path, + NULL); } @@ -9749,10 +9742,10 @@ static int qemuBuildMasterPRCommandLine(virCommandPtr cmd, const virDomainDef *def) { + virBuffer buf = VIR_BUFFER_INITIALIZER; size_t i; bool managedAdded = false; virJSONValuePtr props = NULL; - char *tmp = NULL; int ret = -1; for (i = 0; i < def->ndisks; i++) { @@ -9771,19 +9764,16 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd, if (qemuBuildPRManagerInfoProps(disk, &props) < 0) goto cleanup; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("pr-manager-helper", - disk->src->pr->mgralias, - props))) + if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) goto cleanup; - virJSONValueFree(props); - props = NULL; - virCommandAddArgList(cmd, "-object", tmp, NULL); - VIR_FREE(tmp); + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); } ret = 0; cleanup: + virBufferFreeAndReset(&buf); virJSONValueFree(props); return ret; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 10735622d1..5892c18e5e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -421,10 +421,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, char *devstr = NULL; char *drivestr = NULL; char *drivealias = NULL; + char *prmgrAlias = NULL; bool driveAdded = false; bool secobjAdded = false; bool encobjAdded = false; - bool prmgrAdded = false; bool prdStarted = false; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virJSONValuePtr secobjProps = NULL; @@ -504,15 +504,9 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, encobjAdded = true; } - if (prmgrProps) { - rv = qemuMonitorAddObjectType(priv->mon, "pr-manager-helper", - disk->src->pr->mgralias, - prmgrProps); - prmgrProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) - goto exit_monitor; - prmgrAdded = true; - } + if (prmgrProps && + qemuMonitorAddObject(priv->mon, &prmgrProps, &prmgrAlias) < 0) + goto exit_monitor; if (qemuMonitorAddDrive(priv->mon, drivestr) < 0) goto exit_monitor; @@ -536,6 +530,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, virJSONValueFree(encobjProps); virJSONValueFree(secobjProps); qemuDomainSecretDiskDestroy(disk); + VIR_FREE(prmgrAlias); VIR_FREE(drivealias); VIR_FREE(drivestr); VIR_FREE(devstr); @@ -552,8 +547,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, ignore_value(qemuMonitorDelObject(priv->mon, secinfo->s.aes.alias)); if (encobjAdded) ignore_value(qemuMonitorDelObject(priv->mon, encinfo->s.aes.alias)); - if (prmgrAdded) - ignore_value(qemuMonitorDelObject(priv->mon, disk->src->pr->mgralias)); + if (prmgrAlias) + ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias)); if (qemuDomainObjExitMonitor(driver, vm) < 0) ret = -2; virErrorRestore(&orig_err); -- 2.16.2

On Wed, May 30, 2018 at 07:06:30PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 30 ++++++++++-------------------- src/qemu/qemu_hotplug.c | 19 +++++++------------ 2 files changed, 17 insertions(+), 32 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 61 +++++++++++++++++++------------------------------ src/qemu/qemu_command.h | 1 - src/qemu/qemu_hotplug.c | 15 +++--------- 3 files changed, 27 insertions(+), 50 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 00fb1a3b32..c3573982d6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5495,12 +5495,15 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, virQEMUCapsPtr qemuCaps, - const char **type, virJSONValuePtr *props) { + char *objAlias = NULL; char *charBackendAlias = NULL; int ret = -1; + if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0) + goto cleanup; + switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_RANDOM)) { @@ -5510,11 +5513,11 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, goto cleanup; } - *type = "rng-random"; - - if (virJSONValueObjectCreate(props, "s:filename", rng->source.file, - NULL) < 0) + if (qemuMonitorCreateObjectProps(props, "rng-random", objAlias, + "s:filename", rng->source.file, + NULL) < 0) goto cleanup; + break; case VIR_DOMAIN_RNG_BACKEND_EGD: @@ -5525,13 +5528,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, goto cleanup; } - *type = "rng-egd"; - if (!(charBackendAlias = qemuAliasChardevFromDevAlias(rng->info.alias))) goto cleanup; - if (virJSONValueObjectCreate(props, "s:chardev", charBackendAlias, - NULL) < 0) + if (qemuMonitorCreateObjectProps(props, "rng-egd", objAlias, + "s:chardev", charBackendAlias, + NULL) < 0) goto cleanup; break; @@ -5545,35 +5547,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, ret = 0; cleanup: + VIR_FREE(objAlias); VIR_FREE(charBackendAlias); return ret; } -static char * -qemuBuildRNGBackendStr(virDomainRNGDefPtr rng, - virQEMUCapsPtr qemuCaps) -{ - const char *type = NULL; - char *alias = NULL; - virJSONValuePtr props = NULL; - char *ret = NULL; - - if (virAsprintf(&alias, "obj%s", rng->info.alias) < 0) - goto cleanup; - - if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0) - goto cleanup; - - ret = virQEMUBuildObjectCommandlineFromJSONType(type, alias, props); - - cleanup: - VIR_FREE(alias); - virJSONValueFree(props); - return ret; -} - - char * qemuBuildRNGDevStr(const virDomainDef *def, virDomainRNGDefPtr dev, @@ -5641,8 +5620,11 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, size_t i; for (i = 0; i < def->nrngs; i++) { + virJSONValuePtr props; + virBuffer buf = VIR_BUFFER_INITIALIZER; virDomainRNGDefPtr rng = def->rngs[i]; char *tmp; + int rc; if (!rng->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -5661,12 +5643,17 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, VIR_FREE(tmp); } - /* add the RNG source backend */ - if (!(tmp = qemuBuildRNGBackendStr(rng, qemuCaps))) + if (qemuBuildRNGBackendProps(rng, qemuCaps, &props) < 0) return -1; - virCommandAddArgList(cmd, "-object", tmp, NULL); - VIR_FREE(tmp); + rc = virQEMUBuildObjectCommandlineFromJSON(&buf, props); + virJSONValueFree(props); + + if (rc < 0) + return -1; + + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); /* add the device */ if (!(tmp = qemuBuildRNGDevStr(def, rng, qemuCaps))) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 2b2168d1ee..d2ee01e810 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -142,7 +142,6 @@ char *qemuBuildRNGDevStr(const virDomainDef *def, virQEMUCapsPtr qemuCaps); int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, virQEMUCapsPtr qemuCaps, - const char **type, virJSONValuePtr *props); int qemuOpenPCIConfig(virDomainHostdevDefPtr dev); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 5892c18e5e..238d4b9cc5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1979,11 +1979,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, bool teardowncgroup = false; bool teardowndevice = false; bool chardevAdded = false; - bool objAdded = false; virJSONValuePtr props = NULL; - const char *type; int ret = -1; - int rv; if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0) goto cleanup; @@ -2007,10 +2004,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, if (!(devstr = qemuBuildRNGDevStr(vm->def, rng, priv->qemuCaps))) goto cleanup; - if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &type, &props) < 0) - goto cleanup; - - if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0) + if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &props) < 0) goto cleanup; if (!(charAlias = qemuAliasChardevFromDevAlias(rng->info.alias))) @@ -2032,11 +2026,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, goto exit_monitor; chardevAdded = true; - rv = qemuMonitorAddObjectType(priv->mon, type, objAlias, props); - props = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) + if (qemuMonitorAddObject(priv->mon, &props, &objAlias) < 0) goto exit_monitor; - objAdded = true; if (qemuMonitorAddDevice(priv->mon, devstr) < 0) goto exit_monitor; @@ -2071,7 +2062,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, exit_monitor: virErrorPreserveLast(&orig_err); - if (objAdded) + if (objAlias) ignore_value(qemuMonitorDelObject(priv->mon, objAlias)); if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded) ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); -- 2.16.2

On Wed, May 30, 2018 at 07:06:31PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 61 +++++++++++++++++++------------------------------ src/qemu/qemu_command.h | 1 - src/qemu/qemu_hotplug.c | 15 +++--------- 3 files changed, 27 insertions(+), 50 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 76 ++++++++++++++++++++++++++----------------------- src/qemu/qemu_command.h | 2 +- src/qemu/qemu_hotplug.c | 8 ++---- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c3573982d6..f728b59659 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2943,7 +2943,7 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd, /** * qemuBuildMemoryBackendProps: * @backendProps: [out] constructed object - * @backendType: [out] type of the backennd used + * @alias: alias of the device * @cfg: qemu driver config object * @qemuCaps: qemu capabilities object * @def: domain definition object @@ -2968,7 +2968,7 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd, */ int qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, - const char **backendType, + const char *alias, virQEMUDriverConfigPtr cfg, virQEMUCapsPtr qemuCaps, virDomainDefPtr def, @@ -2976,6 +2976,7 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, virBitmapPtr autoNodeset, bool force) { + const char *backendType = "memory-backend-file"; virDomainNumatuneMemMode mode; const long system_page_size = virGetSystemPageSizeKB(); virDomainMemoryAccess memAccess = mem->access; @@ -2998,7 +2999,6 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, * @useHugepage. */ *backendProps = NULL; - *backendType = NULL; if (mem->targetNode >= 0) { /* memory devices could provide a invalid guest node */ @@ -3087,7 +3087,6 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, if (useHugepage || mem->nvdimmPath || memAccess || def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) { - *backendType = "memory-backend-file"; if (useHugepage) { if (qemuGetDomainHupageMemPath(def, cfg, pagesize, &memPath) < 0) @@ -3140,7 +3139,7 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, break; } } else { - *backendType = "memory-backend-ram"; + backendType = "memory-backend-ram"; } if (virJSONValueObjectAdd(props, "U:size", mem->size * 1024, NULL) < 0) @@ -3174,13 +3173,13 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, ret = 1; } else { /* otherwise check the required capability */ - if (STREQ(*backendType, "memory-backend-file") && + if (STREQ(backendType, "memory-backend-file") && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("this qemu doesn't support the " "memory-backend-file object")); goto cleanup; - } else if (STREQ(*backendType, "memory-backend-ram") && + } else if (STREQ(backendType, "memory-backend-ram") && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("this qemu doesn't support the " @@ -3191,8 +3190,9 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, ret = 0; } - *backendProps = props; - props = NULL; + if (!(*backendProps = qemuMonitorCreateObjectPropsWrap(backendType, alias, + &props))) + ret = -1; cleanup: virJSONValueFree(props); @@ -3206,11 +3206,10 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, virQEMUDriverConfigPtr cfg, size_t cell, qemuDomainObjPrivatePtr priv, - char **backendStr) + virBufferPtr buf) { virJSONValuePtr props = NULL; char *alias = NULL; - const char *backendType; int ret = -1; int rc; virDomainMemoryDef mem = { 0 }; @@ -3220,18 +3219,15 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, if (virAsprintf(&alias, "ram-node%zu", cell) < 0) goto cleanup; - *backendStr = NULL; mem.size = memsize; mem.targetNode = cell; mem.info.alias = alias; - if ((rc = qemuBuildMemoryBackendProps(&props, &backendType, cfg, priv->qemuCaps, + if ((rc = qemuBuildMemoryBackendProps(&props, alias, cfg, priv->qemuCaps, def, &mem, priv->autoNodeset, false)) < 0) goto cleanup; - if (!(*backendStr = virQEMUBuildObjectCommandlineFromJSONType(backendType, - alias, - props))) + if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) goto cleanup; ret = rc; @@ -3244,31 +3240,34 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, } -static char * -qemuBuildMemoryDimmBackendStr(virDomainMemoryDefPtr mem, +static int +qemuBuildMemoryDimmBackendStr(virBufferPtr buf, + virDomainMemoryDefPtr mem, virDomainDefPtr def, virQEMUDriverConfigPtr cfg, qemuDomainObjPrivatePtr priv) { virJSONValuePtr props = NULL; char *alias = NULL; - const char *backendType; - char *ret = NULL; + int ret = -1; if (!mem->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("memory device alias is not assigned")); - return NULL; + return -1; } if (virAsprintf(&alias, "mem%s", mem->info.alias) < 0) goto cleanup; - if (qemuBuildMemoryBackendProps(&props, &backendType, cfg, priv->qemuCaps, + if (qemuBuildMemoryBackendProps(&props, alias, cfg, priv->qemuCaps, def, mem, priv->autoNodeset, true) < 0) goto cleanup; - ret = virQEMUBuildObjectCommandlineFromJSONType(backendType, alias, props); + if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) + goto cleanup; + + ret = 0; cleanup: VIR_FREE(alias); @@ -7397,7 +7396,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, virQEMUCapsPtr qemuCaps = priv->qemuCaps; virBuffer buf = VIR_BUFFER_INITIALIZER; char *cpumask = NULL, *tmpmask = NULL, *next = NULL; - char **nodeBackends = NULL; + virBufferPtr *nodeBackends = NULL; bool needBackend = false; int rc; int ret = -1; @@ -7458,8 +7457,12 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, for (i = 0; i < ncells; i++) { if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) || virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE)) { + + if (VIR_ALLOC(nodeBackends[i]) < 0) + goto cleanup; + if ((rc = qemuBuildMemoryCellBackendStr(def, cfg, i, priv, - &nodeBackends[i])) < 0) + nodeBackends[i])) < 0) goto cleanup; if (rc == 0) @@ -7491,8 +7494,10 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, goto cleanup; } - if (needBackend) - virCommandAddArgList(cmd, "-object", nodeBackends[i], NULL); + if (needBackend) { + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, nodeBackends[i]); + } virCommandAddArg(cmd, "-numa"); virBufferAsprintf(&buf, "node,nodeid=%zu", i); @@ -7555,7 +7560,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, if (nodeBackends) { for (i = 0; i < ncells; i++) - VIR_FREE(nodeBackends[i]); + virBufferFreeAndReset(nodeBackends[i]); VIR_FREE(nodeBackends); } @@ -7576,21 +7581,20 @@ qemuBuildMemoryDeviceCommandLine(virCommandPtr cmd, /* memory hotplug requires NUMA to be enabled - we already checked * that memory devices are present only when NUMA is */ for (i = 0; i < def->nmems; i++) { - char *backStr; + virBuffer buf = VIR_BUFFER_INITIALIZER; char *dimmStr; - if (!(backStr = qemuBuildMemoryDimmBackendStr(def->mems[i], def, - cfg, priv))) + if (qemuBuildMemoryDimmBackendStr(&buf, def->mems[i], def, cfg, priv) < 0) return -1; - if (!(dimmStr = qemuBuildMemoryDeviceStr(def->mems[i]))) { - VIR_FREE(backStr); + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); + + if (!(dimmStr = qemuBuildMemoryDeviceStr(def->mems[i]))) return -1; - } - virCommandAddArgList(cmd, "-object", backStr, "-device", dimmStr, NULL); + virCommandAddArgList(cmd, "-device", dimmStr, NULL); - VIR_FREE(backStr); VIR_FREE(dimmStr); } diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index d2ee01e810..e4f56cf89d 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -120,7 +120,7 @@ int qemuBuildControllerDevStr(const virDomainDef *domainDef, int *nusbcontroller); int qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps, - const char **backendType, + const char *alias, virQEMUDriverConfigPtr cfg, virQEMUCapsPtr qemuCaps, virDomainDefPtr def, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 238d4b9cc5..f8358a8b0b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2098,7 +2098,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, unsigned long long newmem = oldmem + mem->size; char *devstr = NULL; char *objalias = NULL; - const char *backendType; bool objAdded = false; bool teardownlabel = false; bool teardowncgroup = false; @@ -2107,7 +2106,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, virObjectEventPtr event; int id; int ret = -1; - int rv; qemuDomainMemoryDeviceAlignSize(vm->def, mem); @@ -2128,7 +2126,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (!(devstr = qemuBuildMemoryDeviceStr(mem))) goto cleanup; - if (qemuBuildMemoryBackendProps(&props, &backendType, cfg, + if (qemuBuildMemoryBackendProps(&props, objalias, cfg, priv->qemuCaps, vm->def, mem, NULL, true) < 0) goto cleanup; @@ -2154,9 +2152,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, goto removedef; qemuDomainObjEnterMonitor(driver, vm); - rv = qemuMonitorAddObjectType(priv->mon, backendType, objalias, props); - props = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) + if (qemuMonitorAddObject(priv->mon, &props, NULL) < 0) goto exit_monitor; objAdded = true; -- 2.16.2

On Wed, May 30, 2018 at 07:06:32PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 76 ++++++++++++++++++++++++++----------------------- src/qemu/qemu_command.h | 2 +- src/qemu/qemu_hotplug.c | 8 ++---- 3 files changed, 43 insertions(+), 43 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 53 ++++++++++++++++++++----------------------------- src/qemu/qemu_hotplug.c | 8 +------- 2 files changed, 23 insertions(+), 38 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f728b59659..f604a9e8aa 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8792,43 +8792,25 @@ qemuBuildShmemDevStr(virDomainDefPtr def, virJSONValuePtr qemuBuildShmemBackendMemProps(virDomainShmemDefPtr shmem) { + char *mem_alias = NULL; char *mem_path = NULL; virJSONValuePtr ret = NULL; if (virAsprintf(&mem_path, "/dev/shm/%s", shmem->name) < 0) return NULL; - virJSONValueObjectCreate(&ret, - "s:mem-path", mem_path, - "U:size", shmem->size, - "b:share", true, - NULL); - - VIR_FREE(mem_path); - return ret; -} - - -static char * -qemuBuildShmemBackendMemStr(virDomainShmemDefPtr shmem) -{ - char *ret = NULL; - char *alias = NULL; - virJSONValuePtr props = qemuBuildShmemBackendMemProps(shmem); - - if (!props) - return NULL; - - if (virAsprintf(&alias, "shmmem-%s", shmem->info.alias) < 0) + if (virAsprintf(&mem_alias, "shmmem-%s", shmem->info.alias) < 0) goto cleanup; - ret = virQEMUBuildObjectCommandlineFromJSONType("memory-backend-file", - alias, - props); - cleanup: - VIR_FREE(alias); - virJSONValueFree(props); + qemuMonitorCreateObjectProps(&ret, "memory-backend-file", mem_alias, + "s:mem-path", mem_path, + "U:size", shmem->size, + "b:share", true, + NULL); + cleanup: + VIR_FREE(mem_alias); + VIR_FREE(mem_path); return ret; } @@ -8842,7 +8824,10 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, virQEMUCapsPtr qemuCaps, bool chardevStdioLogd) { + virJSONValuePtr memProps = NULL; + virBuffer buf = VIR_BUFFER_INITIALIZER; char *devstr = NULL; + int rc; if (shmem->size) { /* @@ -8876,11 +8861,17 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, break; case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_PLAIN: - if (!(devstr = qemuBuildShmemBackendMemStr(shmem))) + if (!(memProps = qemuBuildShmemBackendMemProps(shmem))) return -1; - virCommandAddArgList(cmd, "-object", devstr, NULL); - VIR_FREE(devstr); + rc = virQEMUBuildObjectCommandlineFromJSON(&buf, memProps); + virJSONValueFree(memProps); + + if (rc < 0) + return -1; + + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); ATTRIBUTE_FALLTHROUGH; case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index f8358a8b0b..02bc88f863 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2751,8 +2751,6 @@ qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, if (!(props = qemuBuildShmemBackendMemProps(shmem))) goto cleanup; - if (virAsprintf(&memAlias, "shmmem-%s", shmem->info.alias) < 0) - goto cleanup; } qemuDomainObjEnterMonitor(driver, vm); @@ -2762,12 +2760,8 @@ qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, &shmem->server.chr) < 0) goto exit_monitor; } else { - if (qemuMonitorAddObjectType(priv->mon, "memory-backend-file", - memAlias, props) < 0) { - props = NULL; + if (qemuMonitorAddObject(priv->mon, &props, &memAlias) < 0) goto exit_monitor; - } - props = NULL; } release_backing = true; -- 2.16.2

On Wed, May 30, 2018 at 07:06:33PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 53 ++++++++++++++++++++----------------------------- src/qemu/qemu_hotplug.c | 8 +------- 2 files changed, 23 insertions(+), 38 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Note that it's okay to pass NULL to qemuDomainDelTLSObjects in qemuDomainAddTLSObjects as the tls-creds-x509 object was either not created or qemu crashed. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 29 +++++++++++++++-------------- src/qemu/qemu_command.h | 1 + src/qemu/qemu_hotplug.c | 25 +++++++++++-------------- src/qemu/qemu_hotplug.h | 2 +- src/qemu/qemu_migration_params.c | 4 ++-- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f604a9e8aa..00ca557025 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -684,6 +684,7 @@ qemuBuildRBDSecinfoURI(virBufferPtr buf, * @tlspath: path to the TLS credentials * @listen: boolen listen for client or server setting * @verifypeer: boolean to enable peer verification (form of authorization) + * @alias: alias for the TLS credentials object * @secalias: if one exists, the alias of the security object for passwordid * @qemuCaps: capabilities * @propsret: json properties to return @@ -696,6 +697,7 @@ int qemuBuildTLSx509BackendProps(const char *tlspath, bool isListen, bool verifypeer, + const char *alias, const char *secalias, virQEMUCapsPtr qemuCaps, virJSONValuePtr *propsret) @@ -706,12 +708,12 @@ qemuBuildTLSx509BackendProps(const char *tlspath, return -1; } - if (virJSONValueObjectCreate(propsret, - "s:dir", tlspath, - "s:endpoint", (isListen ? "server": "client"), - "b:verify-peer", (isListen ? verifypeer : true), - "S:passwordid", secalias, - NULL) < 0) + if (qemuMonitorCreateObjectProps(propsret, "tls-creds-x509", alias, + "s:dir", tlspath, + "s:endpoint", (isListen ? "server": "client"), + "b:verify-peer", (isListen ? verifypeer : true), + "S:passwordid", secalias, + NULL) < 0) return -1; return 0; @@ -741,26 +743,25 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, const char *alias, virQEMUCapsPtr qemuCaps) { + virBuffer buf = VIR_BUFFER_INITIALIZER; int ret = -1; virJSONValuePtr props = NULL; - char *tmp = NULL; - if (qemuBuildTLSx509BackendProps(tlspath, isListen, verifypeer, - certEncSecretAlias, - qemuCaps, &props) < 0) + if (qemuBuildTLSx509BackendProps(tlspath, isListen, verifypeer, alias, + certEncSecretAlias, qemuCaps, &props) < 0) goto cleanup; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("tls-creds-x509", - alias, props))) + if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) goto cleanup; - virCommandAddArgList(cmd, "-object", tmp, NULL); + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); ret = 0; cleanup: + virBufferFreeAndReset(&buf); virJSONValueFree(props); - VIR_FREE(tmp); return ret; } diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index e4f56cf89d..e85efcc980 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -66,6 +66,7 @@ int qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo, int qemuBuildTLSx509BackendProps(const char *tlspath, bool isListen, bool verifypeer, + const char *alias, const char *secalias, virQEMUCapsPtr qemuCaps, virJSONValuePtr *propsret); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 02bc88f863..a6ab73b1af 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -166,11 +166,12 @@ qemuDomainAddDiskSrcTLSObject(virQEMUDriverPtr driver, src->tlsCertdir, false, src->tlsVerify, + src->tlsAlias, &tlsProps, NULL) < 0) goto cleanup; if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, - NULL, NULL, src->tlsAlias, &tlsProps) < 0) + NULL, NULL, &tlsProps) < 0) goto cleanup; ret = 0; @@ -1446,14 +1447,13 @@ qemuDomainAddTLSObjects(virQEMUDriverPtr driver, qemuDomainAsyncJob asyncJob, const char *secAlias, virJSONValuePtr *secProps, - const char *tlsAlias, virJSONValuePtr *tlsProps) { qemuDomainObjPrivatePtr priv = vm->privateData; int rc; virErrorPtr orig_err; - if (!tlsAlias && !secAlias) + if (!tlsProps && !secAlias) return 0; if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) @@ -1467,13 +1467,9 @@ qemuDomainAddTLSObjects(virQEMUDriverPtr driver, goto error; } - if (tlsAlias) { - rc = qemuMonitorAddObjectType(priv->mon, "tls-creds-x509", - tlsAlias, *tlsProps); - *tlsProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rc < 0) - goto error; - } + if (tlsProps && + qemuMonitorAddObject(priv->mon, tlsProps, NULL) < 0) + goto error; return qemuDomainObjExitMonitor(driver, vm); @@ -1481,7 +1477,7 @@ qemuDomainAddTLSObjects(virQEMUDriverPtr driver, virErrorPreserveLast(&orig_err); ignore_value(qemuDomainObjExitMonitor(driver, vm)); virErrorRestore(&orig_err); - qemuDomainDelTLSObjects(driver, vm, asyncJob, secAlias, tlsAlias); + qemuDomainDelTLSObjects(driver, vm, asyncJob, secAlias, NULL); return -1; } @@ -1493,6 +1489,7 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, const char *tlsCertdir, bool tlsListen, bool tlsVerify, + const char *alias, virJSONValuePtr *tlsProps, virJSONValuePtr *secProps) { @@ -1506,7 +1503,7 @@ qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, } if (qemuBuildTLSx509BackendProps(tlsCertdir, tlsListen, tlsVerify, - secAlias, qemuCaps, tlsProps) < 0) + alias, secAlias, qemuCaps, tlsProps) < 0) return -1; return 0; @@ -1555,12 +1552,12 @@ qemuDomainAddChardevTLSObjects(virQEMUDriverPtr driver, cfg->chardevTLSx509certdir, dev->data.tcp.listen, cfg->chardevTLSx509verify, - &tlsProps, &secProps) < 0) + *tlsAlias, &tlsProps, &secProps) < 0) goto cleanup; dev->data.tcp.tlscreds = true; if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, - *secAlias, &secProps, *tlsAlias, &tlsProps) < 0) + *secAlias, &secProps, &tlsProps) < 0) goto cleanup; ret = 0; diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 2059baf47f..f978780c30 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -45,7 +45,6 @@ int qemuDomainAddTLSObjects(virQEMUDriverPtr driver, qemuDomainAsyncJob asyncJob, const char *secAlias, virJSONValuePtr *secProps, - const char *tlsAlias, virJSONValuePtr *tlsProps); int qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, @@ -53,6 +52,7 @@ int qemuDomainGetTLSObjects(virQEMUCapsPtr qemuCaps, const char *tlsCertdir, bool tlsListen, bool tlsVerify, + const char *alias, virJSONValuePtr *tlsProps, virJSONValuePtr *secProps); diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 5976bfdaf2..78688c397f 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -862,7 +862,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver, if (qemuDomainGetTLSObjects(priv->qemuCaps, priv->migSecinfo, cfg->migrateTLSx509certdir, tlsListen, cfg->migrateTLSx509verify, - &tlsProps, &secProps) < 0) + *tlsAlias, &tlsProps, &secProps) < 0) goto error; /* Ensure the domain doesn't already have the TLS objects defined... @@ -872,7 +872,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver, qemuDomainDelTLSObjects(driver, vm, asyncJob, secAlias, *tlsAlias); if (qemuDomainAddTLSObjects(driver, vm, asyncJob, secAlias, &secProps, - *tlsAlias, &tlsProps) < 0) + &tlsProps) < 0) goto error; if (qemuMigrationParamsSetString(migParams, -- 2.16.2

On Wed, May 30, 2018 at 07:06:34PM +0200, Peter Krempa wrote:
Note that it's okay to pass NULL to qemuDomainDelTLSObjects in qemuDomainAddTLSObjects as the tls-creds-x509 object was either not created or qemu crashed.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 29 +++++++++++++++-------------- src/qemu/qemu_command.h | 1 + src/qemu/qemu_hotplug.c | 25 +++++++++++-------------- src/qemu/qemu_hotplug.h | 2 +- src/qemu/qemu_migration_params.c | 4 ++-- 5 files changed, 30 insertions(+), 31 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 31 +++++++--------- src/qemu/qemu_hotplug.c | 77 ++++++++++++++++------------------------ src/qemu/qemu_hotplug.h | 1 - src/qemu/qemu_migration_params.c | 3 +- 4 files changed, 45 insertions(+), 67 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 00ca557025..a4dfda3f14 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -511,18 +511,14 @@ qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo, if (!(keyid = qemuDomainGetMasterKeyAlias())) return -1; - if (virJSONValueObjectCreate(propsret, - "s:data", secinfo->s.aes.ciphertext, - "s:keyid", keyid, - "s:iv", secinfo->s.aes.iv, - "s:format", "base64", NULL) < 0) - goto cleanup; - - ret = 0; + ret = qemuMonitorCreateObjectProps(propsret, + "secret", secinfo->s.aes.alias, + "s:data", secinfo->s.aes.ciphertext, + "s:keyid", keyid, + "s:iv", secinfo->s.aes.iv, + "s:format", "base64", NULL); - cleanup: VIR_FREE(keyid); - return ret; } @@ -543,25 +539,24 @@ static int qemuBuildObjectSecretCommandLine(virCommandPtr cmd, qemuDomainSecretInfoPtr secinfo) { + virBuffer buf = VIR_BUFFER_INITIALIZER; int ret = -1; virJSONValuePtr props = NULL; - char *tmp = NULL; if (qemuBuildSecretInfoProps(secinfo, &props) < 0) return -1; - if (!(tmp = virQEMUBuildObjectCommandlineFromJSONType("secret", - secinfo->s.aes.alias, - props))) + if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) goto cleanup; - virCommandAddArgList(cmd, "-object", tmp, NULL); - ret = 0; + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); + + ret = 0; cleanup: + virBufferFreeAndReset(&buf); virJSONValueFree(props); - VIR_FREE(tmp); - return ret; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index a6ab73b1af..6e7245a481 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -171,7 +171,7 @@ qemuDomainAddDiskSrcTLSObject(virQEMUDriverPtr driver, goto cleanup; if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, - NULL, NULL, &tlsProps) < 0) + NULL, &tlsProps) < 0) goto cleanup; ret = 0; @@ -423,9 +423,9 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, char *drivestr = NULL; char *drivealias = NULL; char *prmgrAlias = NULL; + char *encobjAlias = NULL; + char *secobjAlias = NULL; bool driveAdded = false; - bool secobjAdded = false; - bool encobjAdded = false; bool prdStarted = false; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virJSONValuePtr secobjProps = NULL; @@ -487,23 +487,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); - if (secobjProps) { - rv = qemuMonitorAddObjectType(priv->mon, "secret", secinfo->s.aes.alias, - secobjProps); - secobjProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) - goto exit_monitor; - secobjAdded = true; - } + if (secobjProps && + qemuMonitorAddObject(priv->mon, &secobjProps, &secobjAlias) < 0) + goto exit_monitor; - if (encobjProps) { - rv = qemuMonitorAddObjectType(priv->mon, "secret", encinfo->s.aes.alias, - encobjProps); - encobjProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) - goto exit_monitor; - encobjAdded = true; - } + if (encobjProps && + qemuMonitorAddObject(priv->mon, &encobjProps, &encobjAlias) < 0) + goto exit_monitor; if (prmgrProps && qemuMonitorAddObject(priv->mon, &prmgrProps, &prmgrAlias) < 0) @@ -532,6 +522,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, virJSONValueFree(secobjProps); qemuDomainSecretDiskDestroy(disk); VIR_FREE(prmgrAlias); + VIR_FREE(secobjAlias); + VIR_FREE(encobjAlias); VIR_FREE(drivealias); VIR_FREE(drivestr); VIR_FREE(devstr); @@ -544,10 +536,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, VIR_WARN("Unable to remove drive %s (%s) after failed " "qemuMonitorAddDevice", drivealias, drivestr); } - if (secobjAdded) - ignore_value(qemuMonitorDelObject(priv->mon, secinfo->s.aes.alias)); - if (encobjAdded) - ignore_value(qemuMonitorDelObject(priv->mon, encinfo->s.aes.alias)); + if (secobjAlias) + ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias)); + if (encobjAlias) + ignore_value(qemuMonitorDelObject(priv->mon, encobjAlias)); if (prmgrAlias) ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias)); if (qemuDomainObjExitMonitor(driver, vm) < 0) @@ -1445,32 +1437,29 @@ int qemuDomainAddTLSObjects(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuDomainAsyncJob asyncJob, - const char *secAlias, virJSONValuePtr *secProps, virJSONValuePtr *tlsProps) { qemuDomainObjPrivatePtr priv = vm->privateData; - int rc; virErrorPtr orig_err; + char *secAlias = NULL; - if (!tlsProps && !secAlias) + if (!tlsProps && !secProps) return 0; if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; - if (secAlias) { - rc = qemuMonitorAddObjectType(priv->mon, "secret", - secAlias, *secProps); - *secProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rc < 0) - goto error; - } + if (secProps && + qemuMonitorAddObject(priv->mon, secProps, &secAlias) < 0) + goto error; if (tlsProps && qemuMonitorAddObject(priv->mon, tlsProps, NULL) < 0) goto error; + VIR_FREE(secAlias); + return qemuDomainObjExitMonitor(driver, vm); error: @@ -1478,6 +1467,7 @@ qemuDomainAddTLSObjects(virQEMUDriverPtr driver, ignore_value(qemuDomainObjExitMonitor(driver, vm)); virErrorRestore(&orig_err); qemuDomainDelTLSObjects(driver, vm, asyncJob, secAlias, NULL); + VIR_FREE(secAlias); return -1; } @@ -1557,7 +1547,7 @@ qemuDomainAddChardevTLSObjects(virQEMUDriverPtr driver, dev->data.tcp.tlscreds = true; if (qemuDomainAddTLSObjects(driver, vm, QEMU_ASYNC_JOB_NONE, - *secAlias, &secProps, &tlsProps) < 0) + &secProps, &tlsProps) < 0) goto cleanup; ret = 0; @@ -2305,18 +2295,17 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver, virDomainHostdevDefPtr hostdev) { size_t i; - int rv; int ret = -1; qemuDomainObjPrivatePtr priv = vm->privateData; virErrorPtr orig_err; char *devstr = NULL; char *drvstr = NULL; char *drivealias = NULL; + char *secobjAlias = NULL; bool teardowncgroup = false; bool teardownlabel = false; bool teardowndevice = false; bool driveAdded = false; - bool secobjAdded = false; virJSONValuePtr secobjProps = NULL; virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; qemuDomainSecretInfoPtr secinfo = NULL; @@ -2385,14 +2374,9 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); - if (secobjProps) { - rv = qemuMonitorAddObjectType(priv->mon, "secret", secinfo->s.aes.alias, - secobjProps); - secobjProps = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) - goto exit_monitor; - secobjAdded = true; - } + if (secobjProps && + qemuMonitorAddObject(priv->mon, &secobjProps, &secobjAlias) < 0) + goto exit_monitor; if (qemuMonitorAddDrive(priv->mon, drvstr) < 0) goto exit_monitor; @@ -2424,6 +2408,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver, } qemuDomainSecretHostdevDestroy(hostdev); virJSONValueFree(secobjProps); + VIR_FREE(secobjAlias); VIR_FREE(drivealias); VIR_FREE(drvstr); VIR_FREE(devstr); @@ -2436,8 +2421,8 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver, "qemuMonitorAddDevice", drvstr, devstr); } - if (secobjAdded) - ignore_value(qemuMonitorDelObject(priv->mon, secinfo->s.aes.alias)); + if (secobjAlias) + ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias)); ignore_value(qemuDomainObjExitMonitor(driver, vm)); virErrorRestore(&orig_err); diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index f978780c30..6c952df38c 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -43,7 +43,6 @@ void qemuDomainDelTLSObjects(virQEMUDriverPtr driver, int qemuDomainAddTLSObjects(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuDomainAsyncJob asyncJob, - const char *secAlias, virJSONValuePtr *secProps, virJSONValuePtr *tlsProps); diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 78688c397f..7b0862575f 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -871,8 +871,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver, * some other error path between now and perform . */ qemuDomainDelTLSObjects(driver, vm, asyncJob, secAlias, *tlsAlias); - if (qemuDomainAddTLSObjects(driver, vm, asyncJob, secAlias, &secProps, - &tlsProps) < 0) + if (qemuDomainAddTLSObjects(driver, vm, asyncJob, &secProps, &tlsProps) < 0) goto error; if (qemuMigrationParamsSetString(migParams, -- 2.16.2

On Wed, May 30, 2018 at 07:06:35PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 31 +++++++--------- src/qemu/qemu_hotplug.c | 77 ++++++++++++++++------------------------ src/qemu/qemu_hotplug.h | 1 - src/qemu/qemu_migration_params.c | 3 +- 4 files changed, 45 insertions(+), 67 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 922603a7a3..05a09eb706 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5806,24 +5806,27 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv = vm->privateData; char *alias = NULL; size_t idx; - int rc = -1; int ret = -1; unsigned int orig_niothreads = vm->def->niothreadids; unsigned int exp_niothreads = vm->def->niothreadids; int new_niothreads = 0; qemuMonitorIOThreadInfoPtr *new_iothreads = NULL; virDomainIOThreadIDDefPtr iothrid; + virJSONValuePtr props = NULL; if (virAsprintf(&alias, "iothread%u", iothread_id) < 0) return -1; + if (qemuMonitorCreateObjectProps(&props, "iothread", alias, NULL) < 0) + goto cleanup; + qemuDomainObjEnterMonitor(driver, vm); - rc = qemuMonitorAddObjectType(priv->mon, "iothread", alias, NULL); - exp_niothreads++; - if (rc < 0) + if (qemuMonitorAddObject(priv->mon, &props, NULL) < 0) goto exit_monitor; + exp_niothreads++; + /* After hotplugging the IOThreads we need to re-detect the * IOThreads thread_id's, adjust the cgroups, thread affinity, * and add the thread_id to the vm->def->iothreadids list. @@ -5876,8 +5879,9 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver, VIR_FREE(new_iothreads); } virDomainAuditIOThread(vm, orig_niothreads, new_niothreads, - "update", rc == 0); + "update", ret == 0); VIR_FREE(alias); + virJSONValueFree(props); return ret; exit_monitor: -- 2.16.2

On Wed, May 30, 2018 at 07:06:36PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 - src/qemu/qemu_monitor.c | 34 ---------------------------------- src/qemu/qemu_monitor.h | 5 ----- src/util/virqemu.c | 22 ---------------------- src/util/virqemu.h | 4 ---- 5 files changed, 66 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 37922f8c84..6001635916 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2600,7 +2600,6 @@ virQEMUBuildCommandLineJSONArrayBitmap; virQEMUBuildCommandLineJSONArrayNumbered; virQEMUBuildDriveCommandlineFromJSON; virQEMUBuildObjectCommandlineFromJSON; -virQEMUBuildObjectCommandlineFromJSONType; virQEMUBuildQemuImgKeySecretOpts; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index fe8fdfaf9a..876157437a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3093,40 +3093,6 @@ qemuMonitorAddObject(qemuMonitorPtr mon, } - -/** - * qemuMonitorAddObjectType: - * @mon: Pointer to monitor object - * @type: Type name of object to add - * @objalias: Alias of the new object - * @props: Optional arguments for the given type. The object is consumed and - * should not be referenced by the caller after this function returns. - * - * Returns 0 on success -1 on error. - */ -int -qemuMonitorAddObjectType(qemuMonitorPtr mon, - const char *type, - const char *objalias, - virJSONValuePtr props) -{ - virJSONValuePtr tmpprops = NULL; - int ret = -1; - - VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props); - - if (!(tmpprops = qemuMonitorCreateObjectPropsWrap(type, objalias, &props))) - goto cleanup; - - ret = qemuMonitorAddObject(mon, &tmpprops, NULL); - - cleanup: - virJSONValueFree(props); - virJSONValueFree(tmpprops); - return ret; -} - - int qemuMonitorDelObject(qemuMonitorPtr mon, const char *objalias) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 0c13391520..d6e5a2239e 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -810,11 +810,6 @@ int qemuMonitorAddObject(qemuMonitorPtr mon, virJSONValuePtr *props, char **alias); -int qemuMonitorAddObjectType(qemuMonitorPtr mon, - const char *type, - const char *objalias, - virJSONValuePtr props); - int qemuMonitorDelObject(qemuMonitorPtr mon, const char *objalias); diff --git a/src/util/virqemu.c b/src/util/virqemu.c index 1390b68b86..e16429d80d 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -264,28 +264,6 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf, } -char * -virQEMUBuildObjectCommandlineFromJSONType(const char *type, - const char *alias, - virJSONValuePtr props) -{ - virBuffer buf = VIR_BUFFER_INITIALIZER; - char *ret = NULL; - - if (virQEMUBuildObjectCommandlineFromJSONInternal(&buf, type, alias, props) < 0) - goto cleanup; - - if (virBufferCheckError(&buf) < 0) - goto cleanup; - - ret = virBufferContentAndReset(&buf); - - cleanup: - virBufferFreeAndReset(&buf); - return ret; -} - - int virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, virJSONValuePtr objprops) diff --git a/src/util/virqemu.h b/src/util/virqemu.h index 0a4f4468f2..309be45761 100644 --- a/src/util/virqemu.h +++ b/src/util/virqemu.h @@ -43,10 +43,6 @@ int virQEMUBuildCommandLineJSON(virJSONValuePtr value, virBufferPtr buf, virQEMUBuildCommandLineJSONArrayFormatFunc array); -char *virQEMUBuildObjectCommandlineFromJSONType(const char *type, - const char *alias, - virJSONValuePtr props); - int virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, virJSONValuePtr objprops); -- 2.16.2

On Wed, May 30, 2018 at 07:06:37PM +0200, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 - src/qemu/qemu_monitor.c | 34 ---------------------------------- src/qemu/qemu_monitor.h | 5 ----- src/util/virqemu.c | 22 ---------------------- src/util/virqemu.h | 4 ---- 5 files changed, 66 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa