[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] This patch does 2 jobs:
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 2c0036a1cf4f6c7fc164c837f4c8daf58af1acba # Parent 52260d8c27754a54c636bc73483f51e189281ff7 This patch does 2 jobs: - Enforce the number of CPUs dom0 will take. See the new variable "dom0-cpus" in xend-config.sxp (you will want to set this variable to 1 on SMP systems) - Balloon out dom0 memory when creating domU, if there is not enough free memory. The lowest level we will balloon out is configured via the new variable "dom0-min-mem" in xend-config.sxp I still have a doubt: where to put the code to enforce dom0-cpus. At the moment I put it into python/xen/xend/server/SrvDaemon.py, and hopefully that is resonable enough. Any comment? Signed-off-by: Nguyen Anh Quynh <aquynh@xxxxxxxxx> diff -r 52260d8c2775 -r 2c0036a1cf4f tools/examples/xend-config.sxp --- a/tools/examples/xend-config.sxp Fri Jul 29 10:36:11 2005 +++ b/tools/examples/xend-config.sxp Fri Jul 29 10:36:53 2005 @@ -44,3 +44,11 @@ # Setup script for enbd-backed block devices (block-enbd block-enbd) +# Dom0 will balloon out when needed to free memory for domU. +# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to. +# If dom0-min-mem=0, dom0 will never balloon out. +(dom0-min-mem 0) + +# In SMP system, dom0 will use only CPUs in range [1,dom0-cpus] +# If dom0-cpus = 0, dom0 will take all cpus available +(dom0-cpus 0) diff -r 52260d8c2775 -r 2c0036a1cf4f tools/python/xen/xend/XendRoot.py --- a/tools/python/xen/xend/XendRoot.py Fri Jul 29 10:36:11 2005 +++ b/tools/python/xen/xend/XendRoot.py Fri Jul 29 10:36:53 2005 @@ -75,6 +75,10 @@ """Default port xend serves consoles at. """ console_port_base_default = '9600' + + dom0_min_mem_default = '0' + + dom0_cpus_default = '0' components = {} @@ -329,6 +333,12 @@ def get_vif_antispoof(self): return self.get_config_bool('vif-antispoof', 'yes') + def get_dom0_min_mem(self): + return self.get_config_int('dom0-min-mem', self.dom0_min_mem_default) + + def get_dom0_cpus(self): + return self.get_config_int('dom0-cpus', self.dom0_cpus_default) + def instance(): """Get an instance of XendRoot. Use this instead of the constructor. diff -r 52260d8c2775 -r 2c0036a1cf4f tools/python/xen/xend/server/SrvDaemon.py --- a/tools/python/xen/xend/server/SrvDaemon.py Fri Jul 29 10:36:11 2005 +++ b/tools/python/xen/xend/server/SrvDaemon.py Fri Jul 29 10:36:53 2005 @@ -5,7 +5,6 @@ ########################################################### import os -import os.path import signal import sys import threading @@ -16,6 +15,7 @@ import StringIO import traceback import time +import glob from xen.lowlevel import xu @@ -25,6 +25,7 @@ from xen.xend.XendError import XendError from xen.xend.server import SrvServer from xen.xend.XendLogging import log +from xen.xend import XendRoot; xroot = XendRoot.instance() import channel import controller @@ -327,6 +328,7 @@ return self.cleanup(kill=True) def run(self): + _enforce_dom0_cpus() try: log.info("Xend Daemon started") self.createFactories() @@ -363,6 +365,32 @@ #sys.exit(rc) os._exit(rc) +def _enforce_dom0_cpus(): + dn = xroot.get_dom0_cpus() + + for d in glob.glob("/sys/devices/system/cpu/cpu*"): + cpu = int(os.path.basename(d)[3:]) + if (dn == 0) or (cpu < dn): + v = "1" + else: + v = "0" + try: + f = open("%s/online" %d, "r+") + c = f.read(1) + if (c != v): + if v == "0": + log.info("dom0 is trying to give back cpu %d", cpu) + else: + log.info("dom0 is trying to take cpu %d", cpu) + f.seek(0) + f.write(v) + f.close() + log.info("dom0 successfully enforced cpu %d", cpu) + else: + f.close() + except: + pass + def instance(): global inst try: diff -r 52260d8c2775 -r 2c0036a1cf4f tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Fri Jul 29 10:36:11 2005 +++ b/tools/python/xen/xm/create.py Fri Jul 29 10:36:53 2005 @@ -1,4 +1,5 @@ # Copyright (C) 2004 Mike Wray <mike.wray@xxxxxx> +# Copyright (C) 2005 Nguyen Anh Quynh <aquynh@xxxxxxxxx> """Domain creation. """ @@ -7,10 +8,13 @@ import sys import socket +import xen.lowlevel.xc + from xen.xend import sxp from xen.xend import PrettyPrint from xen.xend.XendClient import server, XendError from xen.xend.XendBootloader import bootloader +from xen.xend import XendRoot; xroot = XendRoot.instance() from xen.util import blkif from xen.util import console_client @@ -644,6 +648,36 @@ % (dom, console_port)) return (dom, console_port) +def get_dom0_alloc(): + """Return current allocation memory of dom0 (in MB). Return 0 on error""" + PROC_XEN_BALLOON = "/proc/xen/balloon" + + f = open(PROC_XEN_BALLOON, "r") + line = f.readline() + for x in line.split(): + for n in x: + if not n.isdigit(): + break + else: + f.close() + return int(x)/1024 + f.close() + return 0 + +def balloon_out(dom0_min_mem, opts): + """Balloon out to get memory for domU, if necessarily""" + SLACK = 4 + + xc = xen.lowlevel.xc.new() + pinfo = xc.physinfo() + free_mem = pinfo['free_pages']/256 + if free_mem < opts.vals.memory + SLACK: + need_mem = opts.vals.memory + SLACK - free_mem + cur_alloc = get_dom0_alloc() + if cur_alloc - need_mem >= dom0_min_mem: + server.xend_domain_mem_target_set(0, cur_alloc - need_mem) + del xc + def main(argv): opts = gopts args = opts.parse(argv) @@ -671,6 +705,10 @@ if opts.vals.dryrun: PrettyPrint.prettyprint(config) else: + dom0_min_mem = xroot.get_dom0_min_mem() + if dom0_min_mem != 0: + balloon_out(dom0_min_mem, opts) + (dom, console) = make_domain(opts, config) if opts.vals.console_autoconnect: path = "/var/lib/xend/console-%s" % console _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |