Port latest changes to release branch
authorSteve Muir <smuir@cs.princeton.edu>
Fri, 4 Nov 2005 19:08:45 +0000 (19:08 +0000)
committerSteve Muir <smuir@cs.princeton.edu>
Fri, 4 Nov 2005 19:08:45 +0000 (19:08 +0000)
lib/cflags-v13.c
lib/planetlab.c
lib/planetlab.h
lib/vserver.h
python/Makefile
python/setup.py [deleted file]
python/vserver.py
python/vserverimpl.c
util-vserver.spec

index 246d1d4..0af2d04 100644 (file)
@@ -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),
index 034c249..6b5d936 100644 (file)
@@ -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);
+}
index 34a9b91..07bbbdb 100644 (file)
@@ -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
index 0b1aa8c..f082f0d 100644 (file)
 #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
index 7ae69d7..42d5c48 100644 (file)
@@ -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 <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
diff --git a/python/setup.py b/python/setup.py
deleted file mode 100644 (file)
index 8491c58..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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)
index 264aee2..9f1bb09 100644 (file)
@@ -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
index 3a93224..7ecaec8 100644 (file)
@@ -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,
index c7fc376..d528fd7 100644 (file)
@@ -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 <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