if (!(dimm = virHashLookup(meminfo, mem->info.alias)))
continue;
- mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM;
- mem->info.addr.dimm.slot = dimm->slot;
- mem->info.addr.dimm.base = dimm->address;
+ switch (mem->model) {
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ mem->currentsize = VIR_DIV_UP(dimm->size, 1024);
+ break;
+
+ case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM;
+ mem->info.addr.dimm.slot = dimm->slot;
+ mem->info.addr.dimm.base = dimm->address;
+ break;
+
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ case VIR_DOMAIN_MEMORY_MODEL_NONE:
+ case VIR_DOMAIN_MEMORY_MODEL_LAST:
+ break;
+ }
}
virHashFree(meminfo);
virJSONValue *cmd;
virJSONValue *reply = NULL;
virJSONValue *data = NULL;
- qemuMonitorMemoryDeviceInfo *meminfo = NULL;
size_t i;
if (!(cmd = qemuMonitorJSONMakeCommand("query-memory-devices", NULL)))
for (i = 0; i < virJSONValueArraySize(data); i++) {
virJSONValue *elem = virJSONValueArrayGet(data, i);
+ g_autofree qemuMonitorMemoryDeviceInfo *meminfo = NULL;
+ virJSONValue *dimminfo;
+ const char *devalias;
const char *type;
if (!(type = virJSONValueObjectGetString(elem, "type"))) {
goto cleanup;
}
- /* dimm memory devices */
- if (STREQ(type, "dimm")) {
- virJSONValue *dimminfo;
- const char *devalias;
-
- if (!(dimminfo = virJSONValueObjectGetObject(elem, "data"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("query-memory-devices reply data doesn't "
- "contain enum data"));
- goto cleanup;
- }
+ if (!(dimminfo = virJSONValueObjectGetObject(elem, "data"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("query-memory-devices reply data doesn't "
+ "contain enum data"));
+ goto cleanup;
+ }
- if (!(devalias = virJSONValueObjectGetString(dimminfo, "id"))) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("dimm memory info data is missing 'id'"));
- goto cleanup;
- }
+ /* While 'id' attribute is marked as optional in QEMU's QAPI
+ * specification, Libvirt always sets it. Thus we can fail if not
+ * present. */
+ if (!(devalias = virJSONValueObjectGetString(dimminfo, "id"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("dimm memory info data is missing 'id'"));
+ goto cleanup;
+ }
- meminfo = g_new0(qemuMonitorMemoryDeviceInfo, 1);
+ meminfo = g_new0(qemuMonitorMemoryDeviceInfo, 1);
+ /* dimm memory devices */
+ if (STREQ(type, "dimm")) {
if (virJSONValueObjectGetNumberUlong(dimminfo, "addr",
&meminfo->address) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
}
- if (virHashAddEntry(info, devalias, meminfo) < 0)
+ } else if (STREQ(type, "virtio-mem")) {
+ if (virJSONValueObjectGetNumberUlong(dimminfo, "size",
+ &meminfo->size) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed/missing size in virtio memory info"));
goto cleanup;
-
- meminfo = NULL;
+ }
+ } else {
+ /* type not handled yet */
+ continue;
}
+
+ if (virHashAddEntry(info, devalias, meminfo) < 0)
+ goto cleanup;
+
+ meminfo = NULL;
}
ret = 0;
cleanup:
- VIR_FREE(meminfo);
virJSONValueFree(cmd);
virJSONValueFree(reply);
return ret;