Skip to content

Commit

Permalink
cset, make it handle cgroup mounts
Browse files Browse the repository at this point in the history
When cpuset has been mounted as a cgroup controller, files are prefixes
with "cpuset.", leading to expected files not existing.  Change cset's
filename expectations depending on mount type.

Signed-off-by: Mike Galbraith <mgalbraith@suse.de>
  • Loading branch information
Mike Galbraith authored and Libor Pechacek committed Dec 22, 2015
1 parent 3530e5d commit 2214078
Showing 1 changed file with 35 additions and 11 deletions.
46 changes: 35 additions & 11 deletions cpuset/cset.py
Expand Up @@ -36,6 +36,11 @@ class CpuSet(object):
# a relative path from this basepath.
sets = {}
basepath = ''
cpus_path = '/cpus'
mems_path = '/mems'
cpu_exclusive_path = '/cpu_exclusive'
mem_exclusive_path = '/mem_exclusive'
tasks_path = '/tasks'

def __init__(self, path=None):
log.debug("initializing CpuSet")
Expand All @@ -56,6 +61,14 @@ def __init__(self, path=None):
del CpuSet.sets
CpuSet.sets = {}
CpuSet.sets[self.path] = self

# if mounted as a cgroup controller, switch file name format
if not os.access(path + CpuSet.cpus_path, os.F_OK):
CpuSet.cpus_path = '/cpuset.cpus'
CpuSet.mems_path = '/cpuset.mems'
CpuSet.cpu_exclusive_path = '/cpuset.cpu_exclusive'
CpuSet.mem_exclusive_path = '/cpuset.mem_exclusive'

# bottom-up search otherwise links will not exist
log.debug("starting bottom-up discovery walk...")
for dir, dirs, files in os.walk(path, topdown=False):
Expand Down Expand Up @@ -104,7 +117,7 @@ def __init__(self, path=None):
log.debug("the cpuset %s already exists, skipping", path)
self = CpuSet.sets[path] # questionable....
return
cpus = CpuSet.basepath + path + "/cpus"
cpus = CpuSet.basepath + path + CpuSet.cpus_path
if not os.access(cpus, os.F_OK):
# not a cpuset directory
str = '%s is not a cpuset directory' % (CpuSet.basepath + path)
Expand All @@ -118,10 +131,16 @@ def locate_cpusets(self):
log.debug("locating cpuset filesystem...")
cpuset = re.compile(r"none (/.+) cpuset .+")
cgroup = re.compile(r"none (/.+) cgroup .+")
cpuset1 = re.compile(r"cpuset (/.+) cpuset .+")
cgroup1 = re.compile(r"cgroup (/.+) cgroup .+")
path = None
f = file("/proc/mounts")
for line in f:
res = cpuset.search(line)
if res:
path = res.group(1)
break
res = cpuset1.search(line)
if res:
path = res.group(1)
break
Expand All @@ -131,6 +150,11 @@ def locate_cpusets(self):
if re.search("cpuset", groups[3]):
path = groups[1]
break
if cgroup1.search(line):
groups = line.split()
if re.search("cpuset", groups[3]):
path = groups[1]
break
f.close()

if not path:
Expand Down Expand Up @@ -158,36 +182,36 @@ def delprop(self):
raise AttributeError, "deletion of properties not allowed"

def getcpus(self):
f = file(CpuSet.basepath+self.path+"/cpus")
f = file(CpuSet.basepath+self.path+CpuSet.cpus_path)
return f.readline()[:-1]
def setcpus(self, newval):
cpuspec_check(newval)
f = file(CpuSet.basepath+self.path+"/cpus",'w')
f = file(CpuSet.basepath+self.path+CpuSet.cpus_path,'w')
f.write(str(newval))
f.close()
log.debug("-> prop_set %s.cpus = %s", self.path, newval)
cpus = property(fget=getcpus, fset=setcpus, fdel=delprop, doc="CPU specifier")

def getmems(self):
f = file(CpuSet.basepath+self.path+"/mems")
f = file(CpuSet.basepath+self.path+CpuSet.mems_path)
return f.readline()[:-1]
def setmems(self, newval):
# FIXME: check format for correctness
f = file(CpuSet.basepath+self.path+"/mems",'w')
f = file(CpuSet.basepath+self.path+CpuSet.mems_path,'w')
f.write(str(newval))
f.close()
log.debug("-> prop_set %s.mems = %s", self.path, newval)
mems = property(getmems, setmems, delprop, "Mem node specifier")

def getcpuxlsv(self):
f = file(CpuSet.basepath+self.path+"/cpu_exclusive")
f = file(CpuSet.basepath+self.path+CpuSet.cpu_exclusive_path)
if f.readline()[:-1] == '1':
return True
else:
return False
def setcpuxlsv(self, newval):
log.debug("-> prop_set %s.cpu_exclusive = %s", self.path, newval)
f = file(CpuSet.basepath+self.path+"/cpu_exclusive",'w')
f = file(CpuSet.basepath+self.path+CpuSet.cpu_exclusive_path,'w')
if newval:
f.write('1')
else:
Expand All @@ -197,14 +221,14 @@ def setcpuxlsv(self, newval):
"CPU exclusive flag")

def getmemxlsv(self):
f = file(CpuSet.basepath+self.path+"/mem_exclusive")
f = file(CpuSet.basepath+self.path+CpuSet.mem_exclusive_path)
if f.readline()[:-1] == '1':
return True
else:
return False
def setmemxlsv(self, newval):
log.debug("-> prop_set %s.mem_exclusive = %s", self.path, newval)
f = file(CpuSet.basepath+self.path+"/mem_exclusive",'w')
f = file(CpuSet.basepath+self.path+CpuSet.mem_exclusive_path,'w')
if newval:
f.write('1')
else:
Expand All @@ -214,7 +238,7 @@ def setmemxlsv(self, newval):
"Memory exclusive flag")

def gettasks(self):
f = file(CpuSet.basepath+self.path+"/tasks")
f = file(CpuSet.basepath+self.path+CpuSet.tasks_path)
lst = []
for task in f: lst.append(task[:-1])
return lst
Expand All @@ -229,7 +253,7 @@ def settasks(self, tasklist):
prog = False
for task in tasklist:
try:
f = file(CpuSet.basepath+self.path+"/tasks",'w')
f = file(CpuSet.basepath+self.path+CpuSet.tasks_path,'w')
f.write(task)
f.close()
except Exception, err:
Expand Down

0 comments on commit 2214078

Please sign in to comment.