1
0
Fork 0

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:
Ondřej Lysoněk 2018-06-03 18:46:55 +02:00
parent f8119fa6c6
commit 9f02e3f23d
2 changed files with 35 additions and 12 deletions

View file

@ -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

View file

@ -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: