So far our memory modules could go only into DIMM slots. But with
virtio model this assumption is no longer true - virtio-pmem goes
onto PCI bus. But for formatting PCI address onto command line we
already have a function - qemuBuildDeviceAddressStr(). Therefore,
mode DIMM address generation into it so that we don't have to
special case address building later on.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_command.c | 17 +++++++++--------
src/qemu/qemu_command.h | 5 ++++-
src/qemu/qemu_hotplug.c | 2 +-
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 649403d638..ae1b7bc81b 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -376,6 +376,10 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
virBufferAsprintf(buf, ",iobase=0x%x,irq=0x%x",
info->addr.isa.iobase,
info->addr.isa.irq);
+ } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM) {
+ virBufferAsprintf(buf, ",slot=%d", info->addr.dimm.slot);
+ if (info->addr.dimm.base)
+ virBufferAsprintf(buf, ",addr=%llu", info->addr.dimm.base);
}
return 0;
@@ -3273,7 +3277,9 @@ qemuBuildMemoryDimmBackendStr(virBufferPtr buf,
char *
-qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem)
+qemuBuildMemoryDeviceStr(const virDomainDef *def,
+ virDomainMemoryDefPtr mem,
+ virQEMUCapsPtr qemuCaps)
{
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
const char *device;
@@ -3315,12 +3321,7 @@ qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem)
virBufferAsprintf(&buf, "memdev=mem%s,id=%s",
mem->info.alias, mem->info.alias);
- if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM) {
- virBufferAsprintf(&buf, ",slot=%d",
mem->info.addr.dimm.slot);
- if (mem->info.addr.dimm.base)
- virBufferAsprintf(&buf, ",addr=%llu",
mem->info.addr.dimm.base);
- }
-
+ qemuBuildDeviceAddressStr(&buf, def, &mem->info, qemuCaps);
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO:
@@ -7465,7 +7466,7 @@ qemuBuildMemoryDeviceCommandLine(virCommandPtr cmd,
virCommandAddArg(cmd, "-object");
virCommandAddArgBuffer(cmd, &buf);
- if (!(dimmStr = qemuBuildMemoryDeviceStr(def->mems[i])))
+ if (!(dimmStr = qemuBuildMemoryDeviceStr(def, def->mems[i],
priv->qemuCaps)))
return -1;
virCommandAddArgList(cmd, "-device", dimmStr, NULL);
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 3da07e25a1..3cfe6ff3e9 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -155,7 +155,10 @@ int qemuBuildMemoryBackendProps(virJSONValuePtr *backendProps,
const virDomainMemoryDef *mem,
bool force);
-char *qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem);
+char *
+qemuBuildMemoryDeviceStr(const virDomainDef *def,
+ virDomainMemoryDefPtr mem,
+ virQEMUCapsPtr qemuCaps);
/* Current, best practice */
char *qemuBuildPCIHostdevDevStr(const virDomainDef *def,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1f9df182bf..bc5dc02a2f 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2412,7 +2412,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
objalias = g_strdup_printf("mem%s", mem->info.alias);
- if (!(devstr = qemuBuildMemoryDeviceStr(mem)))
+ if (!(devstr = qemuBuildMemoryDeviceStr(vm->def, mem, priv->qemuCaps)))
goto cleanup;
if (qemuBuildMemoryBackendProps(&props, objalias, cfg,
--
2.26.2