diff --git a/tuned/plugins/plugin_scheduler.py b/tuned/plugins/plugin_scheduler.py index 7afbbbb..c310762 100644 --- a/tuned/plugins/plugin_scheduler.py +++ b/tuned/plugins/plugin_scheduler.py @@ -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 diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py index 533726a..8b7df57 100644 --- a/tuned/utils/commands.py +++ b/tuned/utils/commands.py @@ -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: