From 810e9a80618f73a22b13af3d8be8d1136b977ca7 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 13 Oct 2016 14:55:47 +0200 Subject: [PATCH] conf: Allow specifying only the slot number for hotpluggable memory Simplify handling of the 'dimm' address element by allowing to specify the slot number only. This will allow libvirt to allocate slot numbers before starting qemu. --- src/conf/domain_conf.c | 18 ++++++++++-------- src/qemu/qemu_command.c | 3 ++- .../qemuxml2argv-memory-hotplug-dimm-addr.args | 2 ++ .../qemuxml2argv-memory-hotplug-dimm-addr.xml | 11 +++++++++-- tests/qemuxml2argvtest.c | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a233c0c420..74efe8c8a1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5007,7 +5007,8 @@ virDomainDeviceInfoFormat(virBufferPtr buf, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM: virBufferAsprintf(buf, " slot='%u'", info->addr.dimm.slot); - virBufferAsprintf(buf, " base='0x%llx'", info->addr.dimm.base); + if (info->addr.dimm.base) + virBufferAsprintf(buf, " base='0x%llx'", info->addr.dimm.base); break; @@ -5408,14 +5409,15 @@ virDomainDeviceDimmAddressParseXML(xmlNodePtr node, } VIR_FREE(tmp); - if (!(tmp = virXMLPropString(node, "base")) || - virStrToLong_ullp(tmp, NULL, 16, &addr->base) < 0) { - virReportError(VIR_ERR_XML_ERROR, - _("invalid or missing dimm base address '%s'"), - NULLSTR(tmp)); - goto cleanup; + if ((tmp = virXMLPropString(node, "base"))) { + if (virStrToLong_ullp(tmp, NULL, 16, &addr->base) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("invalid dimm base address '%s'"), tmp); + goto cleanup; + } + + VIR_FREE(tmp); } - VIR_FREE(tmp); ret = 0; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d3f99d34c6..4a5fce3e10 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3497,7 +3497,8 @@ qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem) if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM) { virBufferAsprintf(&buf, ",slot=%d", mem->info.addr.dimm.slot); - virBufferAsprintf(&buf, ",addr=%llu", mem->info.addr.dimm.base); + if (mem->info.addr.dimm.base) + virBufferAsprintf(&buf, ",addr=%llu", mem->info.addr.dimm.base); } break; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args index 1c881c6541..23403df5eb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.args @@ -15,6 +15,8 @@ QEMU_AUDIO_DRV=none \ mem-path=/dev/hugepages2M/libvirt/qemu,size=536870912,host-nodes=1-3,\ policy=bind \ -device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=4294967296 \ +-object memory-backend-ram,id=memdimm1,size=536870912 \ +-device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=2 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ -nographic \ -nodefaults \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml index 49f2f107f1..fc21dc43c2 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml @@ -2,8 +2,8 @@ QEMUGuest1 c7a5fdbd-edaf-9455-926a-d65c16db1809 1099511627776 - 743423 - 743423 + 7434230 + 7434230 2 hvm @@ -41,5 +41,12 @@
+ + + 524287 + 0 + +
+ diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 22a12e67a7..1ee84025ea 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2096,7 +2096,7 @@ mymain(void) DO_TEST("memory-hotplug-dimm", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); DO_TEST("memory-hotplug-dimm-addr", QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, - QEMU_CAPS_OBJECT_MEMORY_FILE); + QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); DO_TEST("memory-hotplug-ppc64-nonuma", QEMU_CAPS_KVM, QEMU_CAPS_DEVICE_PC_DIMM, QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE);