diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index b35a95f08cb7a8f7f9af1e98d2a9553f43750a75..6ce3b1ef741203993bcafcfa9de6b01099949ff5 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -1748,6 +1748,94 @@ qemuDomainUSBAddressAddHubs(virDomainDefPtr def)
}
+static virBitmapPtr
+qemuDomainGetMemorySlotMap(const virDomainDef *def)
+{
+ virBitmapPtr ret;
+ virDomainMemoryDefPtr mem;
+ size_t i;
+
+ if (!(ret = virBitmapNew(def->mem.memory_slots)))
+ return NULL;
+
+ for (i = 0; i < def->nmems; i++) {
+ mem = def->mems[i];
+
+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM)
+ ignore_value(virBitmapSetBit(ret, mem->info.addr.dimm.slot));
+ }
+
+ return ret;
+}
+
+
+static int
+qemuAssignMemoryDeviceSlot(virDomainMemoryDefPtr mem,
+ virBitmapPtr slotmap)
+{
+ ssize_t nextslot = -1;
+
+ if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM)
+ return 0;
+
+ if ((nextslot = virBitmapNextClearBit(slotmap, -1)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to find a emtpy memory slot"));
+ return -1;
+ }
+
+ ignore_value(virBitmapSetBit(slotmap, nextslot));
+ mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM;
+ mem->info.addr.dimm.slot = nextslot;
+
+ return 0;
+}
+
+
+int
+qemuDomainAssignMemoryDeviceSlot(virDomainDefPtr def,
+ virDomainMemoryDefPtr mem)
+{
+ virBitmapPtr slotmap = NULL;
+ int ret;
+
+ if (!(slotmap = qemuDomainGetMemorySlotMap(def)))
+ return -1;
+
+ ret = qemuAssignMemoryDeviceSlot(mem, slotmap);
+
+ virBitmapFree(slotmap);
+ return ret;
+}
+
+
+static int
+qemuDomainAssignMemorySlots(virDomainDefPtr def)
+{
+ virBitmapPtr slotmap = NULL;
+ int ret = -1;
+ size_t i;
+
+ if (!virDomainDefHasMemoryHotplug(def))
+ return 0;
+
+ if (!(slotmap = qemuDomainGetMemorySlotMap(def)))
+ return -1;
+
+ for (i = 0; i < def->nmems; i++) {
+ if (qemuAssignMemoryDeviceSlot(def->mems[i], slotmap) < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+
+ cleanup:
+ virBitmapFree(slotmap);
+ return ret;
+
+}
+
+
static int
qemuDomainAssignUSBAddresses(virDomainDefPtr def,
virDomainObjPtr obj,
@@ -1827,6 +1915,9 @@ qemuDomainAssignAddresses(virDomainDefPtr def,
if (qemuDomainAssignUSBAddresses(def, obj, newDomain) < 0)
return -1;
+ if (qemuDomainAssignMemorySlots(def) < 0)
+ return -1;
+
return 0;
}
diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h
index 11d6e92a4174b430fb86fe9f6bb1c1086ef75931..ecb92b54005dfc8e17a693b1e8b6c968183c8bf2 100644
--- a/src/qemu/qemu_domain_address.h
+++ b/src/qemu/qemu_domain_address.h
@@ -45,6 +45,10 @@ virDomainCCWAddressSetPtr
qemuDomainCCWAddrSetCreateFromDomain(virDomainDefPtr def)
ATTRIBUTE_NONNULL(1);
+int qemuDomainAssignMemoryDeviceSlot(virDomainDefPtr def,
+ virDomainMemoryDefPtr mem);
+
+
# define __QEMU_DOMAIN_ADDRESS_H__
#endif /* __QEMU_DOMAIN_ADDRESS_H__ */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index fa96a761635dd5f7c0025737764777f7477e73c0..7a023d2974cf5b59981bf002e2d5b8c8dd7c5633 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2132,6 +2132,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
if (qemuDomainDefValidateMemoryHotplug(vm->def, priv->qemuCaps, mem) < 0)
goto cleanup;
+ if (qemuDomainAssignMemoryDeviceSlot(vm->def, mem) < 0)
+ goto cleanup;
+
if (qemuAssignDeviceMemoryAlias(vm->def, mem) < 0)
goto cleanup;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
index 2eb006e6431c71513728addb6d787ccad4ebca87..7b90784020246d56d760f178c3f7cae5dfaab29c 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
@@ -16,7 +16,7 @@ QEMU_AUDIO_DRV=spice \
-object memory-backend-file,id=memdimm0,prealloc=yes,\
mem-path=/dev/hugepages1G/libvirt/qemu,size=1073741824,host-nodes=1-3,\
policy=bind \
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0 \
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
-uuid 63840878-0deb-4095-97e6-fc444d9bc9fa \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-fedora/monitor.sock,server,nowait \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
index fa64fcf41cbe6be9202a44b388ca30451ad508f6..1587aba5345edfe1a60b646ce0b68ba392870e74 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
@@ -12,11 +12,11 @@ QEMU_AUDIO_DRV=none \
-smp 2,sockets=2,cores=1,threads=1 \
-numa node,nodeid=0,cpus=0-1,mem=214 \
-object memory-backend-ram,id=memdimm0,size=536870912 \
--device pc-dimm,node=0,memdev=memdimm0,id=dimm0 \
+-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0 \
-object memory-backend-file,id=memdimm1,prealloc=yes,\
mem-path=/dev/hugepages2M/libvirt/qemu,size=536870912,host-nodes=1-3,\
policy=bind \
--device pc-dimm,node=0,memdev=memdimm1,id=dimm1 \
+-device pc-dimm,node=0,memdev=memdimm1,id=dimm1,slot=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-nographic \
-nodefaults \
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-ppc64-nonuma.args b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-ppc64-nonuma.args
index 8a85fb1c38152b1634aa2b3bed311834bca33afa..475b7214ecae8233255772069364f097588c650e 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-ppc64-nonuma.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-ppc64-nonuma.args
@@ -11,9 +11,9 @@ QEMU_AUDIO_DRV=none \
-m size=1310720k,slots=16,maxmem=4194304k \
-smp 1,sockets=1,cores=1,threads=1 \
-object memory-backend-ram,id=memdimm0,size=536870912 \
--device pc-dimm,memdev=memdimm0,id=dimm0 \
+-device pc-dimm,memdev=memdimm0,id=dimm0,slot=0 \
-object memory-backend-ram,id=memdimm1,size=536870912 \
--device pc-dimm,memdev=memdimm1,id=dimm1 \
+-device pc-dimm,memdev=memdimm1,id=dimm1,slot=1 \
-uuid 49545eb3-75e1-2d0a-acdd-f0294406c99e \
-nographic \
-nodefaults \
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-dimm.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-dimm.xml
index c5b5d7595b0f6b0af98e698b0da09802c253a7af..be97e4ebd40cac0d061e223ba2eaba824d9e424a 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-dimm.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-dimm.xml
@@ -47,6 +47,7 @@