john.levon@sun.com
2007-Mar-22 22:00 UTC
[Xen-devel] [PATCH] Implement auto-ballooning for Solaris
# HG changeset patch # User john.levon@sun.com # Date 1174600845 25200 # Node ID 9a830a5502563c5f95378c6d51d969a1cf8f350b # Parent 507cf151b3c0302ce25ef153d01f4460a4c70c70 Implement auto-ballooning for Solaris /proc/xen/balloon is Linux-specific. Implement a Solaris backend too. Also fix the FMRI for xend. Signed-off-by: Ryan Scott <ryan.scott@sun.com> diff --git a/tools/python/xen/lowlevel/scf/scf.c b/tools/python/xen/lowlevel/scf/scf.c --- a/tools/python/xen/lowlevel/scf/scf.c +++ b/tools/python/xen/lowlevel/scf/scf.c @@ -26,7 +26,7 @@ #include <libscf.h> #include <stdio.h> -#define XEND_FMRI "svc:/system/xen/xend:default" +#define XEND_FMRI "svc:/system/xctl/xend:default" #define XEND_PG "config" static PyObject *scf_exc; diff --git a/tools/python/xen/xend/balloon.py b/tools/python/xen/xend/balloon.py --- a/tools/python/xen/xend/balloon.py +++ b/tools/python/xen/xend/balloon.py @@ -25,9 +25,7 @@ import XendOptions import XendOptions from XendLogging import log from XendError import VmError - - -PROC_XEN_BALLOON = ''/proc/xen/balloon'' +import osdep RETRY_LIMIT = 20 RETRY_LIMIT_INCR = 5 @@ -51,19 +49,7 @@ def _get_proc_balloon(label): """Returns the value for the named label. Returns None if the label was not found or the value was non-numeric.""" - f = file(PROC_XEN_BALLOON, ''r'') - try: - for line in f: - keyvalue = line.split('':'') - if keyvalue[0] == label: - values = keyvalue[1].split() - if values[0].isdigit(): - return int(values[0]) - else: - return None - return None - finally: - f.close() + return osdep.lookup_balloon_stat(label) def get_dom0_current_alloc(): """Returns the current memory allocation (in KiB) of dom0.""" diff --git a/tools/python/xen/xend/osdep.py b/tools/python/xen/xend/osdep.py --- a/tools/python/xen/xend/osdep.py +++ b/tools/python/xen/xend/osdep.py @@ -41,6 +41,55 @@ _vif_script = { "SunOS": "vif-vnic" } +def _linux_balloon_stat(label): + """Returns the value for the named label, or None if an error occurs.""" + + PROC_XEN_BALLOON = ''/proc/xen/balloon'' + f = file(PROC_XEN_BALLOON, ''r'') + try: + for line in f: + keyvalue = line.split('':'') + if keyvalue[0] == label: + values = keyvalue[1].split() + if values[0].isdigit(): + return int(values[0]) + else: + return None + return None + finally: + f.close() + +def _solaris_balloon_stat(label): + """Returns the value for the named label, or None if an error occurs.""" + + import fcntl + import array + DEV_XEN_BALLOON = ''/dev/xen/balloon'' + BLN_IOCTL_CURRENT = 0x4201 + BLN_IOCTL_TARGET = 0x4202 + BLN_IOCTL_LOW = 0x4203 + BLN_IOCTL_HIGH = 0x4204 + BLN_IOCTL_LIMIT = 0x4205 + label_to_ioctl = { ''Current allocation'' : BLN_IOCTL_CURRENT, + ''Requested target'' : BLN_IOCTL_TARGET, + ''Low-mem balloon'' : BLN_IOCTL_LOW, + ''High-mem balloon'' : BLN_IOCTL_HIGH, + ''Xen hard limit'' : BLN_IOCTL_LIMIT } + + f = file(DEV_XEN_BALLOON, ''r'') + try: + values = array.array(''L'', [0]) + if fcntl.ioctl(f.fileno(), label_to_ioctl[label], values, 1) == 0: + return values[0] + else: + return None + finally: + f.close() + +_balloon_stat = { + "SunOS": _solaris_balloon_stat +} + def _get(var, default=None): return var.get(os.uname()[0], default) @@ -49,3 +98,4 @@ pygrub_path = _get(_pygrub_path, "/usr/b pygrub_path = _get(_pygrub_path, "/usr/bin/pygrub") netback_type = _get(_netback_type, "netfront") vif_script = _get(_vif_script, "vif-bridge") +lookup_balloon_stat = _get(_balloon_stat, _linux_balloon_stat) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel