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),
{
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 */
/* 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;
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);
+}
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
#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
#
# 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 <smuir@cs.princeton.edu>
# Mark Huang <mlhuang@cs.princeton.edu>
# 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
+++ /dev/null
-#!/usr/bin/python
-#
-# Python distutils script for util-vserver Python bindings
-#
-# Steve Muir <smuir@cs.princeton.edu>
-# Mark Huang <mlhuang@cs.princeton.edu>
-#
-# 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)
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
# 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,
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:
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
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
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);
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)
{
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,
%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
%changelog
+* Wed Nov 2 2005 Steve Muir <smuir@cs.princeton.edu>
+- fix Python modules to handling scheduling parameters correctly
+
* Fri Oct 28 2005 Steve Muir <smuir@cs.princeton.edu>
- raise exception about being over disk limit after setting usage values