[Kimchi-devel] [PATCH][Kimchi] Fix memory values in guest with attached memory devices

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Sat Feb 27 19:40:05 UTC 2016


There are issues when user attaches memory devices to a guest (memory
hotplug) and try later to modify the memory values offline.
This patch fixes the problems, checking whether there are memory devices
configured and adjusting the newmemory value.
This patch sets the following rules:
- if new memory value is equal max memory, all memory devices will be
  removed
- if new memory is greater than old value, just update the memory
- if new memory is lesser than old value, always remove 1G memory
  devices first and then decrease the memory value until reach the
  amount requested

Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
---
 model/vms.py | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/model/vms.py b/model/vms.py
index c376741..8c3d4c4 100644
--- a/model/vms.py
+++ b/model/vms.py
@@ -825,6 +825,24 @@ class VMModel(object):
         validate_memory({'current': newMem >> 10,
                          'maxmemory': newMaxMem >> 10})
 
+        # Adjust memory devices to new memory, if necessary
+        memDevs = root.findall('./devices/memory')
+        if len(memDevs) != 0 and hasMem:
+            if newMem == newMaxMem:
+                for dev in memDevs:
+                    root.find('./devices').remove(dev)
+            elif newMem > (oldMem << 10):
+                newMem = newMem - (len(memDevs) * (1024 << 10))
+            elif newMem < (oldMem << 10):
+                devsRemove = len(memDevs) - (oldMem - (newMem >> 10))/1024 - 1
+                for dev in memDevs:
+                    if int(dev.xpath('./address/@slot')[0]) > devsRemove:
+                        root.find('./devices').remove(dev)
+                newMem = newMem - (len(root.findall('./devices/memory'))
+                                   * 1024 << 10)
+            elif newMem == (oldMem << 10):
+                newMem = newMem - ((len(memDevs) * 1024) << 10)
+
         def _get_slots(mem, maxMem):
             slots = (maxMem - mem) >> 10 >> 10
             # Libvirt does not accepts slots <= 1
-- 
2.1.0




More information about the Kimchi-devel mailing list