On a Thursday in 2021, Peter Krempa wrote:
This includes the 'pc-dimm', 'nvdimm',
'virtio-pmem-pci' and
'virtio-mem-pci' devices.
The value types according to QEMU are:
'pc-dimm'
node=<uint32> - (default: 0)
memdev=<link<memory-backend>>
'nvdimm'
label-size=<int>
memdev=<link<memory-backend>>
node=<uint32> - (default: 0)
unarmed=<bool> - (default: false)
uuid=<QemuUUID>
'virtio-pmem-pci'
memdev=<link<memory-backend>>
'virtio-mem-pci'
block-size=<size>
memdev=<link<memory-backend>>
node=<uint32> - (default: 0)
requested-size=<size>
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 60 +++++++++++++++++++----------------------
src/qemu/qemu_command.h | 7 +++--
src/qemu/qemu_hotplug.c | 6 ++---
3 files changed, 33 insertions(+), 40 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 6fa804f7d8..794119a58c 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3723,13 +3723,14 @@ qemuBuildMemoryDimmBackendStr(virCommand *cmd,
}
-char *
-qemuBuildMemoryDeviceStr(const virDomainDef *def,
- virDomainMemoryDef *mem,
- virQEMUCaps *qemuCaps G_GNUC_UNUSED)
+virJSONValue *
+qemuBuildMemoryDeviceProps(const virDomainDef *def,
+ virDomainMemoryDef *mem)
{
- g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+ g_autoptr(virJSONValue) props = NULL;
const char *device = NULL;
+ g_autofree char *uuidstr = NULL;
+ virTristateBool unarmed = VIR_TRISTATE_BOOL_ABSENT;
if (!mem->info.alias) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -3761,37 +3762,31 @@ qemuBuildMemoryDeviceStr(const virDomainDef *def,
break;
}
- virBufferAsprintf(&buf, "%s,", device);
-
- if (mem->targetNode >= 0)
- virBufferAsprintf(&buf, "node=%d,", mem->targetNode);
-
- if (mem->labelsize)
- virBufferAsprintf(&buf, "label-size=%llu,", mem->labelsize *
1024);
-
- if (mem->blocksize) {
- virBufferAsprintf(&buf, "block-size=%llu,", mem->blocksize *
1024);
- virBufferAsprintf(&buf, "requested-size=%llu,",
mem->requestedsize * 1024);
- }
+ if (mem->readonly)
+ unarmed = VIR_TRISTATE_BOOL_YES;
if (mem->uuid) {
- char uuidstr[VIR_UUID_STRING_BUFLEN];
-
+ uuidstr = g_new0(char, VIR_UUID_STRING_BUFLEN);
virUUIDFormat(mem->uuid, uuidstr);
- virBufferAsprintf(&buf, "uuid=%s,", uuidstr);
}
- if (mem->readonly) {
- virBufferAddLit(&buf, "unarmed=on,");
- }
-
- virBufferAsprintf(&buf, "memdev=mem%s,id=%s",
- mem->info.alias, mem->info.alias);
+ if (virJSONValueObjectCreate(&props,
+ "s:driver", device,
+ "k:node", mem->targetNode,
+ "P:label-size", mem->labelsize * 1024,
+ "P:block-size", mem->blocksize * 1024,
+ "P:requested-size", mem->requestedsize *
1024,
+ "S:uuid", uuidstr,
+ "T:unarmed", unarmed,
+ "f:memdev", g_strdup_printf("mem%s",
mem->info.alias),
One more usage of 'f'.
Also, I'm really glad these keys use letters, instead of, let's say,
Morse code.
+ "s:id",
mem->info.alias,
+ NULL) < 0)
+ return NULL;
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Jano