Now that there is just one format of the memory balloon command line used the code can be merged into a single function. Additionally with some tweaks to the control flow the code is easier to read. --- src/qemu/qemu_command.c | 76 +++++++++++++++++++------------------------------ src/qemu/qemu_command.h | 4 --- 2 files changed, 29 insertions(+), 51 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5843516..a2448bf 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3397,14 +3397,29 @@ qemuBuildWatchdogCommandLine(virCommandPtr cmd, } -char * -qemuBuildMemballoonDevStr(const virDomainDef *def, - virDomainMemballoonDefPtr dev, - virQEMUCapsPtr qemuCaps) +static int +qemuBuildMemballoonCommandLine(virCommandPtr cmd, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) { virBuffer buf = VIR_BUFFER_INITIALIZER; - switch (dev->info.type) { + if (STREQLEN(def->os.machine, "s390-virtio", 10) && + virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_S390) && def->memballoon) + def->memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_NONE; + + if (!def->memballoon || + def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE) + return 0; + + if (def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Memory balloon device type '%s' is not supported by this version of qemu"), + virDomainMemballoonModelTypeToString(def->memballoon->model)); + return -1; + } + + switch (def->memballoon->info.type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: virBufferAddLit(&buf, "virtio-balloon-pci"); break; @@ -3417,15 +3432,15 @@ qemuBuildMemballoonDevStr(const virDomainDef *def, default: virReportError(VIR_ERR_XML_ERROR, _("memballoon unsupported with address type '%s'"), - virDomainDeviceAddressTypeToString(dev->info.type)); + virDomainDeviceAddressTypeToString(def->memballoon->info.type)); goto error; } - virBufferAsprintf(&buf, ",id=%s", dev->info.alias); - if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0) + virBufferAsprintf(&buf, ",id=%s", def->memballoon->info.alias); + if (qemuBuildDeviceAddressStr(&buf, def, &def->memballoon->info, qemuCaps) < 0) goto error; - if (dev->autodeflate != VIR_TRISTATE_SWITCH_ABSENT) { + if (def->memballoon->autodeflate != VIR_TRISTATE_SWITCH_ABSENT) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("deflate-on-oom is not supported by this QEMU binary")); @@ -3433,49 +3448,16 @@ qemuBuildMemballoonDevStr(const virDomainDef *def, } virBufferAsprintf(&buf, ",deflate-on-oom=%s", - virTristateSwitchTypeToString(dev->autodeflate)); + virTristateSwitchTypeToString(def->memballoon->autodeflate)); } - if (virBufferCheckError(&buf) < 0) - goto error; - - return virBufferContentAndReset(&buf); + virCommandAddArg(cmd, "-device"); + virCommandAddArgBuffer(cmd, &buf); + return 0; error: virBufferFreeAndReset(&buf); - return NULL; -} - - -static int -qemuBuildMemballoonCommandLine(virCommandPtr cmd, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - char *optstr; - - if (STREQLEN(def->os.machine, "s390-virtio", 10) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_S390) && def->memballoon) - def->memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_NONE; - - if (def->memballoon && - def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_NONE) { - if (def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Memory balloon device type '%s' is not supported by this version of qemu"), - virDomainMemballoonModelTypeToString(def->memballoon->model)); - return -1; - } - - virCommandAddArg(cmd, "-device"); - - optstr = qemuBuildMemballoonDevStr(def, def->memballoon, qemuCaps); - if (!optstr) - return -1; - virCommandAddArg(cmd, optstr); - VIR_FREE(optstr); - } - return 0; + return -1; } diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index a3e6a00..3e8ccd8 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -130,10 +130,6 @@ char *qemuBuildControllerDevStr(const virDomainDef *domainDef, virQEMUCapsPtr qemuCaps, int *nusbcontroller); -char *qemuBuildMemballoonDevStr(const virDomainDef *domainDef, - virDomainMemballoonDefPtr dev, - virQEMUCapsPtr qemuCaps); - int qemuBuildMemoryBackendStr(unsigned long long size, unsigned long long pagesize, int guestNode, -- 2.8.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list