From a1f9496198aaa040790c267a3fc29a109119e1fa Mon Sep 17 00:00:00 2001 From: Steve Muir Date: Fri, 4 Nov 2005 19:08:45 +0000 Subject: [PATCH] Port latest changes to release branch --- lib/cflags-v13.c | 1 + lib/planetlab.c | 27 ++++++++++++-------- lib/planetlab.h | 1 - lib/vserver.h | 1 + python/Makefile | 51 ++++++++++++------------------------ python/setup.py | 26 ------------------- python/vserver.py | 10 +------- python/vserverimpl.c | 61 ++++++++++++++++---------------------------- util-vserver.spec | 5 +++- 9 files changed, 63 insertions(+), 120 deletions(-) delete mode 100644 python/setup.py diff --git a/lib/cflags-v13.c b/lib/cflags-v13.c index 246d1d4..0af2d04 100644 --- a/lib/cflags-v13.c +++ b/lib/cflags-v13.c @@ -42,6 +42,7 @@ static struct Mapping_uint64 const VALUES[] = { DECL("sched_hard", VC_VXF_SCHED_HARD), DECL("sched_prio", VC_VXF_SCHED_PRIO), DECL("sched_pause", VC_VXF_SCHED_PAUSE), + DECL("sched_share", VC_VXF_SCHED_SHARE), DECL("virt_mem", VC_VXF_VIRT_MEM), DECL("virt_uptime", VC_VXF_VIRT_UPTIME), diff --git a/lib/planetlab.c b/lib/planetlab.c index 034c249..6b5d936 100644 --- a/lib/planetlab.c +++ b/lib/planetlab.c @@ -47,7 +47,6 @@ create_context(xid_t ctx, uint32_t flags, uint64_t bcaps, const rspec_t *rspec) { struct vc_ctx_caps vc_caps; struct vc_ctx_flags vc_flags; - struct vc_set_sched vc_sched; struct vc_rlimit vc_rlimit; /* create context info */ @@ -69,15 +68,7 @@ create_context(xid_t ctx, uint32_t flags, uint64_t bcaps, const rspec_t *rspec) /* set scheduler parameters */ vc_flags.flagword |= rspec->cpu_sched_flags; - vc_sched.set_mask = (VC_VXSM_FILL_RATE | VC_VXSM_INTERVAL | VC_VXSM_TOKENS | - VC_VXSM_TOKENS_MIN | VC_VXSM_TOKENS_MAX); - vc_sched.fill_rate = rspec->cpu_share; /* tokens accumulated per interval */ - vc_sched.interval = 1000; /* milliseconds */ - vc_sched.tokens = 100; /* initial allocation of tokens */ - vc_sched.tokens_min = 50; /* need this many tokens to run */ - vc_sched.tokens_max = 100; /* max accumulated number of tokens */ - if (vc_set_sched(ctx, &vc_sched)) - return -1; + pl_setsched(ctx, rspec->cpu_share, rspec->cpu_sched_flags); /* set resource limits */ vc_rlimit.min = VC_LIM_KEEP; @@ -141,3 +132,19 @@ pl_chcontext(xid_t ctx, uint32_t flags, uint64_t bcaps, const rspec_t *rspec) return 0; } + +int +pl_setsched(xid_t ctx, uint32_t cpu_share, uint32_t cpu_sched_flags) +{ + struct vc_set_sched vc_sched; + + vc_sched.set_mask = (VC_VXSM_FILL_RATE | VC_VXSM_INTERVAL | VC_VXSM_TOKENS | + VC_VXSM_TOKENS_MIN | VC_VXSM_TOKENS_MAX); + vc_sched.fill_rate = cpu_share; /* tokens accumulated per interval */ + vc_sched.interval = 1000; /* milliseconds */ + vc_sched.tokens = 100; /* initial allocation of tokens */ + vc_sched.tokens_min = 50; /* need this many tokens to run */ + vc_sched.tokens_max = 100; /* max accumulated number of tokens */ + + return vc_set_sched(ctx, &vc_sched); +} diff --git a/lib/planetlab.h b/lib/planetlab.h index 34a9b91..07bbbdb 100644 --- a/lib/planetlab.h +++ b/lib/planetlab.h @@ -44,7 +44,6 @@ typedef struct { uint64_t task_limit; } rspec_t; -#define VC_VXF_SCHED_SHARE 0x00000800 #define VC_VXF_SCHED_FLAGS (VC_VXF_SCHED_HARD | VC_VXF_SCHED_SHARE) int diff --git a/lib/vserver.h b/lib/vserver.h index 0b1aa8c..f082f0d 100644 --- a/lib/vserver.h +++ b/lib/vserver.h @@ -169,6 +169,7 @@ #define VC_VXF_SCHED_HARD 0x00000100ull #define VC_VXF_SCHED_PRIO 0x00000200ull #define VC_VXF_SCHED_PAUSE 0x00000400ull +#define VC_VXF_SCHED_SHARE 0x00000800ull #define VC_VXF_VIRT_MEM 0x00010000ull #define VC_VXF_VIRT_UPTIME 0x00020000ull diff --git a/python/Makefile b/python/Makefile index 7ae69d7..42d5c48 100644 --- a/python/Makefile +++ b/python/Makefile @@ -1,53 +1,36 @@ # # GNUMakefile for util-vserver Python bindings # -# It's too hard to integrate distutils into the autoconf/libtool -# framework, so run this Makefile separately from and after the normal -# util-vserver build. -# # Steve Muir # Mark Huang # Copyright (C) 2005 The Trustees of Princeton University # -# $Id: Makefile,v 1.7 2005/08/26 04:00:44 mlhuang Exp $ +# $Id: Makefile,v 1.10 2005/11/01 22:02:04 smuir Exp $ # -ALL := vserverimpl.so vduimpl.so util_vserver_vars.py +INCLUDES := -I.. -I../lib +LIBS = -L../lib -lvserver + +PY_MODS := vserver.py cpulimit.py bwlimit.py +PY_EXT_MODS := vduimpl.so vserverimpl.so + +LT_LINK = ../libtool --tag=CC --mode=link + + -# need command substitution -SHELL := /bin/bash +all: py-build -pythonlibdir := @libdir@/python@PYTHON_VERSION@/site-packages +# XXX - compatibility with util-vserver specfile +INSTALL_ROOT ?= $(DESTDIR) -all: $(ALL) +install: py-install -%.o: %.c - # builds object and incompletely linked library - python setup.py build_ext - # copy to current directory - cp -a build/temp.*/*.o . +clean: py-clean -vserverimpl.so vduimpl.so: %.so: %.o - # relink the object against libvserver with libtool - ../libtool --tag=CC --mode=link $(CC) -shared -o $@ $< ../lib/libvserver.la -util_vserver_vars.py: ../scripts/util-vserver-vars - # python does not export variables beginning with underscore - (. $< ; \ - while read var ; do eval echo $$var=\$${$$var} ; done < \ - <(sed -ne "s/\([^=]*\)=.*/\1/p" $<) \ - | sed -e "s/^_*//" -e "s/\([^=]*\)=\(.*\)/\1='\2'/") > $@ -install: $(ALL) - # install relinked libraries and byte-compiled scripts - python setup.py install --root="$(DESTDIR)" - # reinstall libraries with libtool so that the final path - # to libvserver is resolved - for so in $(filter %.so, $(ALL)) ; do \ - ../libtool --tag=CC --mode=install install "$$so" `find "$(DESTDIR)" -name "$$so"` ; \ - done +UTIL_PYTHON ?= $(wildcard ../../util-python*) -clean: - rm -rf $(ALL) *.o build +include $(UTIL_PYTHON)/pybuild.mk .PHONY: all install clean diff --git a/python/setup.py b/python/setup.py deleted file mode 100644 index 8491c58..0000000 --- a/python/setup.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/python -# -# Python distutils script for util-vserver Python bindings -# -# Steve Muir -# Mark Huang -# -# Copyright (C) 2005 The Trustees of Princeton University -# -# $Id$ -# - -from distutils.core import setup, Extension - -extension_args = {} -extension_args['extra_compile_args'] = ['-Wall'] -extension_args['include_dirs'] = ['..', '../lib'] -# Link against libvserver with libtool later -#extension_args['library_dirs'] = ['../lib'] -#extension_args['libraries'] = ['vserver'] - -modules = ['util_vserver_vars', 'vserver', 'cpulimit', 'bwlimit'] -extensions = [Extension('vduimpl', ['vduimpl.c'], **extension_args), - Extension('vserverimpl', ['vserverimpl.c'], **extension_args)] - -setup(py_modules = modules, ext_modules = extensions) diff --git a/python/vserver.py b/python/vserver.py index 264aee2..9f1bb09 100644 --- a/python/vserver.py +++ b/python/vserver.py @@ -114,7 +114,6 @@ class VServer: def set_disklimit(self, block_limit): # block_limit is in kB - over_limit = False if self.vm_running: block_usage = vserverimpl.DLIMIT_KEEP inode_usage = vserverimpl.DLIMIT_KEEP @@ -122,8 +121,6 @@ class VServer: # init_disk_info() must have been called to get usage values block_usage = self.disk_blocks inode_usage = self.disk_inodes - if block_limit < block_usage: - over_limit = True vserverimpl.setdlimit(self.dir, self.ctx, @@ -133,10 +130,6 @@ class VServer: vserverimpl.DLIMIT_INF, # inode limit 2) # %age reserved for root - if over_limit: - raise Exception, ("%s disk usage (%u blocks) > limit (%u)" % - (self.name, block_usage, block_limit)) - def get_disklimit(self): try: @@ -145,7 +138,6 @@ class VServer: except OSError, ex: if ex.errno == errno.ESRCH: # get here if no vserver disk limit has been set for xid - # set blockused to -1 to indicate no limit blocktotal = -1 return blocktotal @@ -157,7 +149,7 @@ class VServer: self.__update_config_file(self.config_file, { "CPULIMIT": cpu_share }) if self.vm_running: - vserverimpl.setsched(self.ctx, cpu_share, True) + vserverimpl.setsched(self.ctx, self.resources) def get_sched(self): # have no way of querying scheduler right now on a per vserver basis diff --git a/python/vserverimpl.c b/python/vserverimpl.c index 3a93224..7ecaec8 100644 --- a/python/vserverimpl.c +++ b/python/vserverimpl.c @@ -57,8 +57,13 @@ vserver_chcontext(PyObject *self, PyObject *args) PyObject *resources; PyObject *cpu_share; - if (!PyArg_ParseTuple(args, "IO!|K", &ctx, &PyDict_Type, &resources, &flags)) + if (!PyArg_ParseTuple(args, "IO|K", &ctx, &resources, &flags)) return NULL; + if (!PyMapping_Check(resources)) + { + PyErr_SetString(PyExc_TypeError, "invalid resources object"); + return NULL; + } if ((cpu_share = PyMapping_GetItemString(resources, "nm_cpu_share")) && (cpu_share = PyNumber_Int(cpu_share))) rspec.cpu_share = PyInt_AsLong(cpu_share); @@ -117,54 +122,34 @@ vserver_get_rlimit(PyObject *self, PyObject *args) { return ret; } -#if 0 /* * setsched */ static PyObject * vserver_setsched(PyObject *self, PyObject *args) { - xid_t xid; - struct vc_set_sched sched; - struct vc_ctx_flags flags; - unsigned cpuguaranteed = 0; - - sched.set_mask = (VC_VXSM_FILL_RATE | - VC_VXSM_INTERVAL | - VC_VXSM_TOKENS_MIN | - VC_VXSM_TOKENS_MAX); - - if (!PyArg_ParseTuple(args, "I|I|I|I|I|I|I", &xid, - &sched.fill_rate, - &sched.interval, - &sched.tokens, - &sched.tokens_min, - &sched.tokens_max, - &cpuguaranteed)) - return NULL; - - flags.flagword = VC_VXF_SCHED_HARD; - flags.mask |= VC_VXF_SCHED_HARD; -#define VC_VXF_SCHED_SHARE 0x00000800ull - if (cpuguaranteed==0) { - flags.flagword |= VC_VXF_SCHED_SHARE; - flags.mask |= VC_VXF_SCHED_SHARE; - } + xid_t ctx; + rspec_t rspec = { 32, VC_VXF_SCHED_FLAGS, -1, -1 }; + PyObject *resources; + PyObject *cpu_share; - if (vc_set_cflags(xid, &flags) == -1) - return PyErr_SetFromErrno(PyExc_OSError); + if (!PyArg_ParseTuple(args, "IO", &ctx, &resources)) + return NULL; + if (!PyMapping_Check(resources)) + { + PyErr_SetString(PyExc_TypeError, "invalid resources object"); + return NULL; + } + if ((cpu_share = PyMapping_GetItemString(resources, "nm_cpu_share")) && + (cpu_share = PyNumber_Int(cpu_share))) + rspec.cpu_share = PyInt_AsLong(cpu_share); - if (vc_set_sched(xid, &sched) == -1) - return PyErr_SetFromErrno(PyExc_OSError); + if (pl_setsched(ctx, rspec.cpu_share, rspec.cpu_sched_flags)) + PyErr_SetFromErrno(PyExc_OSError); return Py_None; } -/* - * setsched - */ -#endif - static PyObject * vserver_get_dlimit(PyObject *self, PyObject *args) { @@ -231,10 +216,8 @@ vserver_set_dlimit(PyObject *self, PyObject *args) static PyMethodDef methods[] = { { "chcontext", vserver_chcontext, METH_VARARGS, "chcontext to vserver with provided flags" }, -#if 0 { "setsched", vserver_setsched, METH_VARARGS, "Change vserver scheduling attributes for given vserver context" }, -#endif { "setdlimit", vserver_set_dlimit, METH_VARARGS, "Set disk limits for given vserver context" }, { "getdlimit", vserver_get_dlimit, METH_VARARGS, diff --git a/util-vserver.spec b/util-vserver.spec index c7fc376..d528fd7 100644 --- a/util-vserver.spec +++ b/util-vserver.spec @@ -17,7 +17,7 @@ %define name util-vserver %define version 0.30.208 -%define release 3.planetlab%{?date:.%{date}} +%define release 4.planetlab%{?date:.%{date}} %define _without_dietlibc 1 %define _without_xalan 1 @@ -381,6 +381,9 @@ done %changelog +* Wed Nov 2 2005 Steve Muir +- fix Python modules to handling scheduling parameters correctly + * Fri Oct 28 2005 Steve Muir - raise exception about being over disk limit after setting usage values -- 2.43.0