On 01/28/2015 05:30 AM, Peter Krempa wrote:
With the new JSON to argv formatter we are now able to represent the
memory backend definitions in the JSON object format that is reusable
for monitor use (hotplug) and then convert it into the shell string.
This will avoid having two separate instances of the same code that
would create the different formats.
Previous refactors now allow to make this step without changes to the
test suite.
---
src/qemu/qemu_command.c | 109 +++++++++++++++++++++++++++---------------------
1 file changed, 62 insertions(+), 47 deletions(-)
Ran changes through my Coverity checker... Issue found with this change...
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 0c343b6..bb58a09 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4533,12 +4533,10 @@ qemuBuildMemoryBackendStr(unsigned long long size,
virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virQEMUDriverConfigPtr cfg,
- const char *aliasPrefix,
- size_t id,
- char **backendStr,
+ const char **backendType,
+ virJSONValuePtr *backendProps,
bool force)
{
- virBuffer buf = VIR_BUFFER_INITIALIZER;
virDomainHugePagePtr master_hugepage = NULL;
virDomainHugePagePtr hugepage = NULL;
virDomainNumatuneMemMode mode;
@@ -4546,11 +4544,15 @@ qemuBuildMemoryBackendStr(unsigned long long size,
virMemAccess memAccess = def->cpu->cells[guestNode].memAccess;
size_t i;
char *mem_path = NULL;
- char *nodemask = NULL;
- char *tmpmask = NULL, *next = NULL;
+ virBitmapPtr nodemask = NULL;
int ret = -1;
+ virJSONValuePtr props = NULL;
- *backendStr = NULL;
+ *backendProps = NULL;
+ *backendType = NULL;
+
+ if (!(props = virJSONValueNewObject()))
+ return -1;
mode = virDomainNumatuneGetMode(def->numatune, guestNode);
@@ -4623,16 +4625,23 @@ qemuBuildMemoryBackendStr(unsigned long long size,
if (!(mem_path = qemuGetHugepagePath(&cfg->hugetlbfs[i])))
goto cleanup;
- virBufferAsprintf(&buf, "memory-backend-file,id=%s%zu",
aliasPrefix, id);
- virBufferAsprintf(&buf, ",prealloc=yes,mem-path=%s", mem_path);
+ *backendType = "memory-backend-file";
+
+ if (virJSONValueObjectAdd(props,
+ "b:prealloc", true,
+ "s:mem-path", mem_path,
+ NULL) < 0)
+ goto cleanup;
switch (memAccess) {
case VIR_MEM_ACCESS_SHARED:
- virBufferAddLit(&buf, ",share=yes");
+ if (virJSONValueObjectAdd(props, "b:share", true, NULL) < 0)
+ goto cleanup;
break;
case VIR_MEM_ACCESS_PRIVATE:
- virBufferAddLit(&buf, ",share=no");
+ if (virJSONValueObjectAdd(props, "b:share", false, NULL) < 0)
+ goto cleanup;
break;
case VIR_MEM_ACCESS_DEFAULT:
@@ -4647,43 +4656,30 @@ qemuBuildMemoryBackendStr(unsigned long long size,
goto cleanup;
}
- virBufferAsprintf(&buf, "memory-backend-ram,id=%s%zu",
aliasPrefix, id);
+ *backendType = "memory-backend-ram";
}
- virBufferAsprintf(&buf, ",size=%llu", size * 1024);
+ if (virJSONValueObjectAdd(props, "U:size", size * 1024, NULL) < 0)
+ goto cleanup;
if (userNodeset) {
- if (!(nodemask = virBitmapFormat(userNodeset)))
- goto cleanup;
+ nodemask = userNodeset;
} else {
- if (virDomainNumatuneMaybeFormatNodeset(def->numatune, autoNodeset,
- &nodemask, guestNode) < 0)
+ if (virDomainNumatuneMaybeGetNodeset(def->numatune, autoNodeset,
+ &nodemask, guestNode) < 0)
goto cleanup;
}
if (nodemask) {
- if (strchr(nodemask, ',') &&
- !virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("disjoint NUMA node ranges are not supported "
- "with this QEMU"));
+ if (virJSONValueObjectAdd(props,
+ "m:host-nodes", nodemask,
+ "S:policy",
qemuNumaPolicyTypeToString(mode),
+ NULL) < 0)
goto cleanup;
- }
-
- for (tmpmask = nodemask; tmpmask; tmpmask = next) {
- if ((next = strchr(tmpmask, ',')))
- *(next++) = '\0';
- virBufferAddLit(&buf, ",host-nodes=");
- virBufferAdd(&buf, tmpmask, -1);
- }
-
- virBufferAsprintf(&buf, ",policy=%s",
qemuNumaPolicyTypeToString(mode));
}
- if (virBufferCheckError(&buf) < 0)
- goto cleanup;
-
- *backendStr = virBufferContentAndReset(&buf);
+ *backendProps = props;
+ props = NULL;
if (!hugepage) {
if ((nodemask || force) &&
@@ -4705,8 +4701,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
ret = 0;
cleanup:
- virBufferFreeAndReset(&buf);
- VIR_FREE(nodemask);
+ virJSONValueFree(props);
VIR_FREE(mem_path);
return ret;
@@ -4721,19 +4716,39 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def,
virBitmapPtr auto_nodeset,
char **backendStr)
{
- int ret;
+ virJSONValuePtr props = NULL;
+ char *alias = NULL;
+ const char *backendType;
+ int ret = -1;
+ int rc;
- ret = qemuBuildMemoryBackendStr(def->cpu->cells[cell].mem, 0, cell,
- NULL, auto_nodeset,
- def, qemuCaps, cfg,
- "ram-node", cell,
- backendStr, false);
+ *backendStr = NULL;
- if (ret == 1) {
- VIR_FREE(*backendStr);
- return 0;
+ if (virAsprintf(&alias, "ram-node%zu", cell) < 0)
+ goto cleanup;
+
+ if ((rc = qemuBuildMemoryBackendStr(def->cpu->cells[cell].mem, 0, cell,
+ NULL, auto_nodeset,
+ def, qemuCaps, cfg,
+ &backendType, &props, false)) < 0)
+ goto cleanup;
+
+ if (rc == 1) {
+ ret = 0;
+ goto cleanup;
}
Coverity Error: CONSTANT_EXPRESSION_RESULT
4735
(1) Event result_independent_of_operands: "!(*backendStr =
qemuBuildObjectCommandlineFromJSON(backendType, alias, props)) < 0" is
always false regardless of the values of its operands. This occurs as
the logical operand of if.
4736 if (!(*backendStr =
qemuBuildObjectCommandlineFromJSON(backendType,
4737 alias,
4738 props))
< 0)
^^^^
Looks like the " < 0" is unnecessary
And of course it cglames the goto cleanup is DEADCODE because of that.
+ if (!(*backendStr =
qemuBuildObjectCommandlineFromJSON(backendType,
+ alias,
+ props)) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(alias);
+ virJSONValueFree(props);
+
return ret;
}