dom0/qmemman: call do_balance after each domain list change notification (#246)

For unknown reason watch '@releaseDomain' is called twice: first when domain
disappeared from xenstore, second when resources (including memory) are freed.
So call do_balance after each of this event to redistribute freed memory.
This commit is contained in:
Marek Marczykowski 2011-09-30 15:23:57 +02:00
parent aa08f555c3
commit d456ec4575
2 changed files with 3 additions and 3 deletions

View File

@ -29,7 +29,6 @@ class SystemState:
def del_domain(self, id): def del_domain(self, id):
self.domdict.pop(id) self.domdict.pop(id)
self.do_balance()
def get_free_xen_memory(self): def get_free_xen_memory(self):
return self.xc.physinfo()['free_memory']*1024 return self.xc.physinfo()['free_memory']*1024

View File

@ -29,11 +29,11 @@ class WatchType:
class XS_Watcher: class XS_Watcher:
def __init__(self): def __init__(self):
self.handle = xen.lowlevel.xs.xs() self.handle = xen.lowlevel.xs.xs()
self.handle.watch('/local/domain', WatchType(XS_Watcher.domain_list_changed, None)) self.handle.watch('@introduceDomain', WatchType(XS_Watcher.domain_list_changed, None))
self.handle.watch('@releaseDomain', WatchType(XS_Watcher.domain_list_changed, None))
self.watch_token_dict = {} self.watch_token_dict = {}
def domain_list_changed(self, param): def domain_list_changed(self, param):
time.sleep(0.05)
curr = self.handle.ls('', '/local/domain') curr = self.handle.ls('', '/local/domain')
if curr == None: if curr == None:
return return
@ -50,6 +50,7 @@ class XS_Watcher:
self.watch_token_dict.pop(i) self.watch_token_dict.pop(i)
system_state.del_domain(i) system_state.del_domain(i)
global_lock.release() global_lock.release()
system_state.do_balance()
def meminfo_changed(self, domain_id): def meminfo_changed(self, domain_id):
untrusted_meminfo_key = self.handle.read('', get_domain_meminfo_key(domain_id)) untrusted_meminfo_key = self.handle.read('', get_domain_meminfo_key(domain_id))