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@gmail.com>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-07-29 10:36:53 +00:00
1 parent 613f9362cf
commit 084dedfee3
4 files changed
+85 -1

No files matched your search

+10
View File
@@ -76,6 +76,10 @@ class XendRoot:
"""Default port xend serves consoles at. """
console_port_base_default = '9600'
dom0_min_mem_default = '0'
dom0_cpus_default = '0'
components = {}
def __init__(self):
@@ -329,6 +333,12 @@ class XendRoot:
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.
+29 -1
View File
@@ -5,7 +5,6 @@
###########################################################
import os
import os.path
import signal
import sys
import threading
@@ -16,6 +15,7 @@ import re
import StringIO
import traceback
import time
import glob
from xen.lowlevel import xu
@@ -25,6 +25,7 @@ from xen.xend import EventServer; eserver = EventServer.instance()
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 @@ class Daemon:
return self.cleanup(kill=True)
def run(self):
_enforce_dom0_cpus()
try:
log.info("Xend Daemon started")
self.createFactories()
@@ -363,6 +365,32 @@ class Daemon:
#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:
+38
View File
@@ -1,4 +1,5 @@
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
# Copyright (C) 2005 Nguyen Anh Quynh <aquynh@gmail.com>
"""Domain creation.
"""
@@ -7,10 +8,13 @@ import string
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 @@ def make_domain(opts, config):
% (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 @@ def main(argv):
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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.