From 5b93a576583d8830fd6636df73d65349017bb617 Mon Sep 17 00:00:00 2001 From: Alvaro Lopez Garcia Date: Thu, 10 May 2012 10:30:29 +0200 Subject: Report memory correctly on Xen. Fixes bug 997014 /proc/meminfo may show wrong values for the memory when using Xen, so this fix computes the memory quering libivrt. Change-Id: I188e2d34bcee13954653b93b9b816cf4530b8859 --- nova/virt/libvirt/connection.py | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 5ceca9f48..e60cda0cd 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -1859,10 +1859,15 @@ class LibvirtConnection(driver.ComputeDriver): if sys.platform.upper() not in ['LINUX2', 'LINUX3']: return 0 - meminfo = open('/proc/meminfo').read().split() - idx = meminfo.index('MemTotal:') - # transforming kb to mb. - return int(meminfo[idx + 1]) / 1024 + if FLAGS.libvirt_type == 'xen': + meminfo = self._conn.getInfo()[1] + # this is in MB + return meminfo + else: + meminfo = open('/proc/meminfo').read().split() + idx = meminfo.index('MemTotal:') + # transforming KB to MB + return int(meminfo[idx + 1]) / 1024 @staticmethod def get_local_gb_total(): @@ -1911,8 +1916,26 @@ class LibvirtConnection(driver.ComputeDriver): idx1 = m.index('MemFree:') idx2 = m.index('Buffers:') idx3 = m.index('Cached:') - avail = (int(m[idx1 + 1]) + int(m[idx2 + 1]) + int(m[idx3 + 1])) / 1024 - return self.get_memory_mb_total() - avail + if FLAGS.libvirt_type == 'xen': + used = 0 + for domain_id in self._conn.listDomainsID(): + # skip dom0 + dom_mem = int(self._conn.lookupByID(domain_id).info()[2]) + if domain_id != 0: + used += dom_mem + else: + # the mem reported by dom0 is be greater of what + # it is being used + used += (dom_mem - + (int(m[idx1 + 1]) + + int(m[idx2 + 1]) + + int(m[idx3 + 1]))) + # Convert it to MB + return used / 1024 + else: + avail = (int(m[idx1 + 1]) + int(m[idx2 + 1]) + int(m[idx3 + 1])) + # Convert it to MB + return self.get_memory_mb_total() - avail / 1024 def get_local_gb_used(self): """Get the free hdd size(GB) of physical computer. -- cgit