scheduler: Store saved affinity as a bitmask rather than list
Store saved CPU affinity of processes as a bitmask rather than a CPU list. It should be much more memory-efficient. Signed-off-by: Ondřej Lysoněk <olysonek@redhat.com>
This commit is contained in:
parent
f8119fa6c6
commit
9f02e3f23d
2 changed files with 35 additions and 12 deletions
|
|
@ -19,13 +19,28 @@ import errno
|
|||
log = tuned.logs.get()
|
||||
|
||||
class SchedulerParams(object):
|
||||
def __init__(self, cmdline = None, scheduler = None, priority = None,
|
||||
affinity = None):
|
||||
def __init__(self, cmd, cmdline = None, scheduler = None,
|
||||
priority = None, affinity = None):
|
||||
self._cmd = cmd
|
||||
self.cmdline = cmdline
|
||||
self.scheduler = scheduler
|
||||
self.priority = priority
|
||||
self.affinity = affinity
|
||||
|
||||
@property
|
||||
def affinity(self):
|
||||
if self._affinity is None:
|
||||
return None
|
||||
else:
|
||||
return self._cmd.bitmask2cpulist(self._affinity)
|
||||
|
||||
@affinity.setter
|
||||
def affinity(self, value):
|
||||
if value is None:
|
||||
self._affinity = None
|
||||
else:
|
||||
self._affinity = self._cmd.cpulist2bitmask(value)
|
||||
|
||||
class IRQAffinities(object):
|
||||
def __init__(self):
|
||||
self.irqs = {}
|
||||
|
|
@ -228,7 +243,7 @@ class SchedulerPlugin(base.Plugin):
|
|||
try:
|
||||
params = self._scheduler_original[pid]
|
||||
except KeyError:
|
||||
params = SchedulerParams()
|
||||
params = SchedulerParams(self._cmd)
|
||||
self._scheduler_original[pid] = params
|
||||
if params.scheduler is None and params.priority is None:
|
||||
params.scheduler = scheduler
|
||||
|
|
@ -260,7 +275,7 @@ class SchedulerPlugin(base.Plugin):
|
|||
try:
|
||||
params = self._scheduler_original[pid]
|
||||
except KeyError:
|
||||
params = SchedulerParams()
|
||||
params = SchedulerParams(self._cmd)
|
||||
self._scheduler_original[pid] = params
|
||||
if params.affinity is None:
|
||||
params.affinity = affinity
|
||||
|
|
|
|||
|
|
@ -259,17 +259,21 @@ class commands:
|
|||
if mask is None:
|
||||
return None
|
||||
mask = str(mask).replace(",", "")
|
||||
cpu = 0
|
||||
cpus = []
|
||||
try:
|
||||
m = int(mask, 16)
|
||||
except ValueError:
|
||||
log.error("invalid hexadecimal mask '%s'" % str(mask))
|
||||
return []
|
||||
while m > 0:
|
||||
if m & 1:
|
||||
return self.bitmask2cpulist(m)
|
||||
|
||||
# Converts an integer bitmask to a list of cpus (e.g. [0,3,4])
|
||||
def bitmask2cpulist(self, mask):
|
||||
cpu = 0
|
||||
cpus = []
|
||||
while mask > 0:
|
||||
if mask & 1:
|
||||
cpus.append(cpu)
|
||||
m >>= 1
|
||||
mask >>= 1
|
||||
cpu += 1
|
||||
return cpus
|
||||
|
||||
|
|
@ -366,12 +370,10 @@ class commands:
|
|||
def cpulist2hex(self, l):
|
||||
if l is None:
|
||||
return None
|
||||
m = 0
|
||||
ul = self.cpulist_unpack(l)
|
||||
if ul is None:
|
||||
return None
|
||||
for v in ul:
|
||||
m |= pow(2, v)
|
||||
m = self.cpulist2bitmask(ul)
|
||||
s = "%x" % m
|
||||
ls = len(s)
|
||||
if ls % 8 != 0:
|
||||
|
|
@ -379,6 +381,12 @@ class commands:
|
|||
s = s.zfill(ls)
|
||||
return ",".join(s[i:i + 8] for i in range(0, len(s), 8))
|
||||
|
||||
def cpulist2bitmask(self, l):
|
||||
m = 0
|
||||
for v in l:
|
||||
m |= pow(2, v)
|
||||
return m
|
||||
|
||||
def process_recommend_file(self, fname):
|
||||
matching_profile = None
|
||||
try:
|
||||
|
|
|
|||
Loading…
Reference in a new issue