Fixes for F16.
authorMarco Yuen <marcoy@cs.princeton.edu>
Mon, 5 Mar 2012 18:37:19 +0000 (13:37 -0500)
committerMarco Yuen <marcoy@cs.princeton.edu>
Mon, 5 Mar 2012 18:37:19 +0000 (13:37 -0500)
cgroup is now mounted automatcially by systemd and the way is mounted is
very different from before. Hence, cgroups.py needs to be changed to
reflect the new mount point, and it doesn't use inotify to monitor the
FS anymore. Everything is done dynamically at runtime.

Changes for Coresched are cgroups related.

Since /var is mounted on tmpfs, os.rename doesn't work across partition,
so shutil.move is used instead.

cgroups.py
coresched.py
tools.py

index cf6ca98..ebd4b56 100644 (file)
@@ -8,7 +8,8 @@ import pyinotify
 import logger
 
 # Base dir for libvirt
-BASE_DIR = '/cgroup/libvirt/'
+BASE_DIR = '/sys/fs/cgroup'
+SUB_SYSTEMS = ['blkio', 'freezer', 'devices', 'memory', 'cpu,cpuacct', 'cpuset']
 VIRT_TECHS = ['lxc']
 
 # Global cgroup mapping. 
@@ -31,36 +32,41 @@ class CgroupWatch(pyinotify.ProcessEvent):
                        (event.name, event.path))
 
 
-logger.verbose("Cgroups: Recognizing already existing cgroups...")
-for virt in VIRT_TECHS:
-    filenames = os.listdir(os.path.join(BASE_DIR, virt))
-    for filename in filenames:
-       path = os.path.join(BASE_DIR, virt, filename)
-       if os.path.isdir(path):
-           CGROUPS[filename] = path
+#logger.verbose("Cgroups: Recognizing already existing cgroups...")
+#for virt in VIRT_TECHS:
+#    filenames = os.listdir(os.path.join(BASE_DIR, virt))
+#    for filename in filenames:
+       path = os.path.join(BASE_DIR, virt, filename)
+       if os.path.isdir(path):
+           CGROUPS[filename] = path
 
-logger.verbose("Cgroups: Initializing watchers...")
-wm = pyinotify.WatchManager()
-notifier = pyinotify.ThreadedNotifier(wm, CgroupWatch())
-for virt in VIRT_TECHS:
-       wdd = wm.add_watch(os.path.join(BASE_DIR, virt),
-                          pyinotify.IN_DELETE | pyinotify.IN_CREATE,
-                          rec=False)
-notifier.daemon = True
-notifier.start()
+#logger.verbose("Cgroups: Initializing watchers...")
+#wm = pyinotify.WatchManager()
+#notifier = pyinotify.ThreadedNotifier(wm, CgroupWatch())
+#for virt in VIRT_TECHS:
+#    wdd = wm.add_watch(os.path.join(BASE_DIR, virt),
+#               pyinotify.IN_DELETE | pyinotify.IN_CREATE,
+#               rec=False)
+#notifier.daemon = True
+#notifier.start()
+
+def get_cgroup_paths():
+    cpusetBase  = os.path.join(BASE_DIR, 'cpuset', 'libvirt', 'lxc')
+    return filter(os.path.isdir,
+                  map(lambda f: os.path.join(cpusetBase, f),
+                      os.listdir(cpusetBase)))
 
 def get_cgroup_path(name):
-    """ Returns the base path for the cgroup with a specific name """
-    assert CGROUPS.has_key(name), \
-           "No sliver %s managed by libvirt through cgroup!" % name
-    return CGROUPS[name]
+    """ Returns the base path for the cgroup with a specific name or None."""
+    return reduce(lambda a, b: b if os.path.basename(b) == name else a,
+                  get_cgroup_paths(), None)
 
 def get_base_path():
     return BASE_DIR
 
 def get_cgroups():
     """ Returns the list of cgroups active at this moment on the node """
-    return CGROUPS.keys()
+    return map(os.path.basename, get_cgroup_paths())
 
 def write(name, key, value):
     """ Writes a value to the file key with the cgroup with name """
@@ -72,4 +78,4 @@ def append(name, key, value):
     """ Appends a value to the file key with the cgroup with name """
     base_path = get_cgroup_path(name)
     with open(os.path.join(base_path, key), 'a') as f:
-        print >>f, value       
+        print >>f, value
index 3959e48..7c91fba 100644 (file)
@@ -10,6 +10,7 @@ import os
 import cgroups
 
 glo_coresched_simulate = False
+joinpath = os.path.join
 
 class CoreSched:
     """ Whole-core scheduler
@@ -33,7 +34,7 @@ class CoreSched:
         self.mems_map={}
         self.cpu_siblings={}
 
-    def get_cgroup_var(self, name=None, filename=None):
+    def get_cgroup_var(self, name=None, subsys=None, filename=None):
         """ decode cpuset.cpus or cpuset.mems into a list of units that can
             be reserved.
         """
@@ -42,7 +43,9 @@ class CoreSched:
 
         if filename==None:
             # filename="/dev/cgroup/" + name
-            filename=cgroups.get_base_path() + name
+            filename = reduce(lambda a, b: joinpath(a, b) if b else a, [subsys, name],
+                              cgroups.get_base_path())
+
         data = open(filename).readline().strip()
 
         if not data:
@@ -72,7 +75,7 @@ class CoreSched:
         if self.cpus!=[]:
             return self.cpus
 
-        self.cpus = self.get_cgroup_var(self.cgroup_var_name)
+        self.cpus = self.get_cgroup_var(self.cgroup_var_name, 'cpuset')
 
         self.cpu_siblings = {}
         for item in self.cpus:
@@ -275,7 +278,7 @@ class CoreSched:
         if self.mems!=[]:
             return self.mems
 
-        self.mems = self.get_cgroup_var(self.cgroup_mem_name)
+        self.mems = self.get_cgroup_var(self.cgroup_mem_name, 'cpuset')
 
         # build a mapping from memory nodes to the cpus they can be used with
 
@@ -337,7 +340,9 @@ class CoreSched:
             return []
         siblings = []
 
-        x = int(open(fn,"rt").readline().strip(),16)
+        x = open(fn, 'rt').readline().strip().split(',')[-1]
+        x = int(x, 16)
+
         cpuid = 0
         while (x>0):
             if (x&1)!=0:
index 99e6dac..9aee6a4 100644 (file)
--- a/tools.py
+++ b/tools.py
@@ -10,6 +10,7 @@ import fcntl
 import errno
 import threading
 import subprocess
+import shutil
 
 import logger
 
@@ -111,7 +112,7 @@ The return value is the pid of the other running process, or None otherwise."""
 
 def write_file(filename, do_write, **kw_args):
     """Write file <filename> atomically by opening a temporary file, using <do_write> to write that file, and then renaming the temporary file."""
-    os.rename(write_temp_file(do_write, **kw_args), filename)
+    shutil.move(write_temp_file(do_write, **kw_args), filename)
 
 def write_temp_file(do_write, mode=None, uidgid=None):
     fd, temporary_filename = tempfile.mkstemp()
@@ -148,7 +149,7 @@ def replace_file_with_string (target, new_contents, chmod=None, remove_if_empty=
     os.close(fd)
     if os.path.exists(target):
         os.unlink(target)
-    os.rename(name,target)
+    shutil.move(name,target)
     if chmod: os.chmod(target,chmod)
     return True