On 11/03/2016 02:12 AM, Peter Krempa wrote:
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(-)
Interestingly both 'slot' and 'base' are optional in the
domaincommon.rng (dimmaddress). Neither are described in the
formatdomain.html.in which IIRC was a developer decision (I have a vague
recollection of doing a review and noting that)...
Still if an <address> was provided, 'slot' doesn't seem to have been
treated as optional in most places (used cscope to search on dimm.slot).
Even though it's optional, it seems qemuDomainUpdateMemoryDeviceInfo is
run in order to fill in the "running domain's" dimm.{slot,base} from the
qemuMonitorGetMemoryDeviceInfo; however, there's no "assurance" that
dimm.slot is the same as the alias dimm#. IOW: We've never guaranteed
that dimm.slot is the same as the dimm# alias number. It just happens to
work that way due to the algorithm or until someone comes along and
messes with the karma.
In any case, the code below seems fine (implied ACK), but I think that
domaincommon.rng could use a tweak to make 'slot' non optional, which
should be fine since <address> is still optional. Before you push
though, consider my comments in patch2.
John
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a233c0c..74efe8c 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 96c4f31..4e530d1 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3478,7 +3478,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 1c881c6..23403df 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 49f2f10..fc21dc4 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm-addr.xml
@@ -2,8 +2,8 @@
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<maxMemory slots='16'
unit='KiB'>1099511627776</maxMemory>
- <memory unit='KiB'>743423</memory>
- <currentMemory unit='KiB'>743423</currentMemory>
+ <memory unit='KiB'>7434230</memory>
+ <currentMemory unit='KiB'>7434230</currentMemory>
<vcpu placement='static' cpuset='0-1'>2</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
@@ -41,5 +41,12 @@
</target>
<address type='dimm' slot='0' base='0x100000000'/>
</memory>
+ <memory model='dimm'>
+ <target>
+ <size unit='KiB'>524287</size>
+ <node>0</node>
+ </target>
+ <address type='dimm' slot='2'/>
+ </memory>
</devices>
</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index d025930..81dab9f 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2095,7 +2095,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);