]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Assign slots to memory devices prior to usage
authorPeter Krempa <pkrempa@redhat.com>
Tue, 1 Nov 2016 05:07:09 +0000 (06:07 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 10 Nov 2016 16:36:55 +0000 (17:36 +0100)
As with other devices assign the slot number right away when adding the
device. This will make the slot numbers static as we do with other
addressing elements and it will ultimately simplify allocation of the
alias in a static way which does not break with qemu.

src/qemu/qemu_domain_address.c
src/qemu/qemu_domain_address.h
src/qemu/qemu_hotplug.c
tests/qemuxml2argvdata/qemuxml2argv-hugepages-numa.args
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-dimm.args
tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-ppc64-nonuma.args
tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-dimm.xml

index b35a95f08cb7a8f7f9af1e98d2a9553f43750a75..6ce3b1ef741203993bcafcfa9de6b01099949ff5 100644 (file)
@@ -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;
 }
 
index 11d6e92a4174b430fb86fe9f6bb1c1086ef75931..ecb92b54005dfc8e17a693b1e8b6c968183c8bf2 100644 (file)
@@ -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__ */
index fa96a761635dd5f7c0025737764777f7477e73c0..7a023d2974cf5b59981bf002e2d5b8c8dd7c5633 100644 (file)
@@ -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;
 
index 2eb006e6431c71513728addb6d787ccad4ebca87..7b90784020246d56d760f178c3f7cae5dfaab29c 100644 (file)
@@ -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 \
index fa64fcf41cbe6be9202a44b388ca30451ad508f6..1587aba5345edfe1a60b646ce0b68ba392870e74 100644 (file)
@@ -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 \
index 8a85fb1c38152b1634aa2b3bed311834bca33afa..475b7214ecae8233255772069364f097588c650e 100644 (file)
@@ -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 \
index c5b5d7595b0f6b0af98e698b0da09802c253a7af..be97e4ebd40cac0d061e223ba2eaba824d9e424a 100644 (file)
@@ -47,6 +47,7 @@
         <size unit='KiB'>523264</size>
         <node>0</node>
       </target>
+      <address type='dimm' slot='0'/>
     </memory>
     <memory model='dimm'>
       <source>
@@ -57,6 +58,7 @@
         <size unit='KiB'>524287</size>
         <node>0</node>
       </target>
+      <address type='dimm' slot='1'/>
     </memory>
   </devices>
 </domain>