From e476531b0eb84065625be9692a23183a6a58034e Mon Sep 17 00:00:00 2001 From: Rafal Wojtczuk Date: Thu, 16 Sep 2010 15:57:11 +0200 Subject: [PATCH] Leave XEN_FREE_MEM_LEFT of Xen free memory. Needed for driver domain, to be able to get contiguous memory for its drivers. --- dom0/qmemman/qmemman.py | 7 ++++--- dom0/qmemman/qmemman_algo.py | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dom0/qmemman/qmemman.py b/dom0/qmemman/qmemman.py index cbfc0543..934bd61c 100755 --- a/dom0/qmemman/qmemman.py +++ b/dom0/qmemman/qmemman.py @@ -19,6 +19,7 @@ class SystemState: self.xc = xen.lowlevel.xc.xc() self.xs = xen.lowlevel.xs.xs() self.BALOON_DELAY = 0.1 + self.XEN_FREE_MEM_LEFT = 50*1024*1024 def add_domain(self, id): self.domdict[id] = DomainState(id) @@ -74,7 +75,7 @@ class SystemState: while True: xenfree = self.get_free_xen_memory() print 'got xenfree=', xenfree - if xenfree >= memsize: + if xenfree >= memsize + self.XEN_FREE_MEM_LEFT: return True self.refresh_memactual() if prev_memory_actual is not None: @@ -82,7 +83,7 @@ class SystemState: if prev_memory_actual[i] == self.domdict[i].memory_actual: self.domdict[i].no_progress = True print 'domain', i, 'stuck at', self.domdict[i].memory_actual - memset_reqs = qmemman_algo.balloon(memsize-xenfree, self.domdict) + memset_reqs = qmemman_algo.balloon(memsize + self.XEN_FREE_MEM_LEFT - xenfree, self.domdict) print 'requests:', memset_reqs if niter > MAX_TRIES or len(memset_reqs) == 0: return False @@ -124,7 +125,7 @@ class SystemState: return self.refresh_memactual() xenfree = self.get_free_xen_memory() - memset_reqs = qmemman_algo.balance(xenfree, self.domdict) + memset_reqs = qmemman_algo.balance(xenfree - self.XEN_FREE_MEM_LEFT, self.domdict) if not self.is_balance_req_significant(memset_reqs): return diff --git a/dom0/qmemman/qmemman_algo.py b/dom0/qmemman/qmemman_algo.py index 06037206..fdda893e 100755 --- a/dom0/qmemman/qmemman_algo.py +++ b/dom0/qmemman/qmemman_algo.py @@ -118,6 +118,9 @@ def balance_when_low_on_memory(domdict, xenfree, total_mem_pref_acceptors, donor continue squeezed_mem -= avail donors_rq.append((i, prefmem(domdict[i]))) +#the below can happen if initially xen free memory is below 50M + if squeezed_mem < 0: + return donors_rq for i in acceptors: scale = 1.0*prefmem(domdict[i])/total_mem_pref_acceptors target_nonint = domdict[i].memory_actual + scale*squeezed_mem